1、基本概念
镜像:用程序员的角度来说,就是一个类
容器:镜像的实例,等同于类的实例
仓库:保存镜像的地方,分共有和私有的区别
问题1:实例数据如何保存
问:如果容器是镜像的实例,那么实例运行的数据保存在什么地方
答:通过传递文件路径,实例的数据保存在宿主主机的文件系统目录中(通过docker的数据管理来与宿主主机文件系统通信),传递过程可以参考文章使用Docker搭建GitLab实践:http://www.open-open.com/lib/view/open1438009785316.html。可以通过启动带参数建立数据卷,但是如果没有容器使用的情况,生命周期会结束。
问题2:数据卷有什么用?
答:可以在多个容器中通过数据卷容器进行共享,可以在容器外针对数据卷进行恢复和保存,摆脱没有实例使用的时候数据发生丢失
参考:http://www.widuu.com/chinese_docker/userguide/dockervolumes.html
问题3:docker中的日志查看
问:如果查看日志
答: a) docker logs 容器ID
b)docker logs –f 容器ID 与tail –f 到文件上一样
c)docker logs –ft 容器ID 与tail –f 一样,并且加上时间戳
d)启动用--log-driver="syslog"加载日志驱动
参考:http://blog.youkuaiyun.com/chen_shiqiang/article/details/51438879
问题4:容器如何监控
答: docker top 和docker stats命令,其中docker top显示所偶的进程信息,docker stats显示cpu使用、内存使用和网络IO的使用情况
参考:
http://blog.youkuaiyun.com/chen_shiqiang/article/details/51438879 docker日志学习二
http://blog.youkuaiyun.com/rually/article/details/50651874 如何优雅的查看docker容器的日志
问题5:容器启动资源如何隔离
答:docker run 中的命令参数,man docker-run可以看到
介绍较详细文档:http://blog.youkuaiyun.com/horsefoot/article/details/51731543
问题6:docker与微服务架构关系
答:微服务构架:将用户现有的复杂系统拆分成多个微服务,每个微服务的内容用一个镜像管理。通过 Docker Compose 模板描述服务之间的依赖关系和配置。通过容器服务选择之前创建的编排模板创建应用。总体来说,docker是微服务的一个工具
问题7:在docker容器之间是否有负载均衡方案
答:有,新的docker 1.12.0开始支持,介绍比较详细的文档: http://www.tuicool.com/articles/QV7NvyA
2、docker常用命令
参考:http://wiselyman.iteye.com/blog/2114418
安装docker
yum install docker #安装docker
systemctl start docker.service #启动docker
systemctl enable docker.service #docker开机启动
版本信息查看
docker -v #查看docker版本
docker info #查看docker具体信息
下载和查看资源
docker pull centos #下载centos image
docker images #显示已有image
启动和关闭系统:
docker run -i -t centos /bin/bash #启动系统
docker stop $(docker ps -a -q) #停止所有容器
删除相关资源:
docker rm $(docker ps -a -q) #删除所有container
docker rmi imageid #删除image
docker rmi $(docker images -q) #删除所有image
其中,rm是删除容器,rmi是删除镜像
查看容器信息:
docker inspect container_name #查看容器信息
docker inspect container_name | grep IPAddress #查看当前容器ip地地址
docker attach --sig-proxy=false 304f5db405ec (按control +c 退出不停止容器)
3、入门简单例子
查找:
[root@bogon ~]# docker search learn/tutorial
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/learn/tutorial
下载:
[root@bogon ~]# docker pull learn/tutorial
Using default tag: latest
Trying to pull repository docker.io/learn/tutorial ...
latest: Pulling from docker.io/learn/tutorial
271134aeb542: Pull complete
Digest: sha256:2933b82e7c2a72ad8ea89d58af5d1472e35dacd5b7233577483f58ff8f9338bd
Status: Downloaded newer image for docker.io/learn/tutorial:latest
安装容器并运行hello world:
[root@bogon ~]# docker run learn/tutorial /bin/echo hello world
hello world
容器中安装ping:
[root@bogon ~]# docker run learn/tutorial apt-get install -y ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 3s (16.1 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...
获得容器ID:
[root@bogon ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5053727d639a learn/tutorial "apt-get install -y p" About a minute ago Exited (0) About a minute ago elated_payne
提交保存为新镜像
[root@bogon ~]# docker commit 5053727d639a learn/ping
sha256:78ab42b973f6b5a5005b8b52fdcd079365845bde9c599bb0c464db4facd3e848
运行新镜像
[root@bogon ~]# docker run learn/ping ping www.baidu.com
PING www.a.shifen.com (220.181.111.188) 56(84) bytes of data.
64 bytes from 220.181.111.188: icmp_req=2 ttl=46 time=4.52 ms
64 bytes from 220.181.111.188: icmp_req=3 ttl=46 time=5.11 ms
64 bytes from 220.181.111.188: icmp_req=4 ttl=46 time=5.56 ms
查询对应的新id
[root@bogon ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7305bca157df learn/ping "ping www.baidu.com" About a minute ago Exited (0) About a minute ago gloomy_kowalevski
查看镜像:
docker inspect 7305bca157df
相关配置比较复杂,另外文章介绍。
发布镜像:
docker push learn/ping
4、docker启用一个centos
非常完美的教程,参考:
http://www.jb51.net/article/96177.htm
注意点:
1>命令docker run -d -i -t <imageID> /bin/bash
2>#退出,但不停止容器 Ctrl+P+Q
3>安装ifconfig和ssh后,需要重新commit一个镜像
4>docker run -d -p 10022:22 herong/centos7-ssh:latest /usr/sbin/sshd -D
5>sshd无法启动,请使用生成key命令:
[root@b5926410fe60 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' [root@b5926410fe60 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' [root@b5926410fe60 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
最终结果:客户端—>宿主机--->docker启动的centos,端口为10022,ssh通过连接到宿主机的10022端口,最终到达用容器启动的centos的22端口
5、Docker 容器基础系统镜像打包
因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具。根据这个思路,我们就可以构建一个自己的容器基础系统镜像。
构建标准的 Linux rootfs 的方式有很多种方法,Redhat、Debian、SUSE等主流的发行版都有提供相应的工具支持。rootfs为Linux系统中的根文件系统Root FileSystem的简称。
大概的流程如下:构建基础的 rootfs —> 配置基础系统参数 —> 部署用户自定义软件 —> 清理系统 —> 打包为容器镜像 —> 测试镜像 —> 发布仓库
基于Ubuntu进行基础系统镜像包的制作方式见:http://www.jb51.net/article/101509.htm
6、常见问题
指定一个registry
docker pull [-a|--all-tags] [--help] NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
比如: docker pull registry.hub.docker.com/fedora:20
docker如何制作镜像
commit和dockerfile方式
查看启动后容器版本:
a)启动,要注意使用-i -t ,并且启动完成后使用/bin/bash环境
run -i -t -p 8888:8888 -p 6006:6006 tensorflow/tensorflow /bin/bash
b)查看linux版本信息
参考:http://jingyan.baidu.com/article/ff4116259b127c12e48237a1.html
查看linux内核版本号的三种命令:
第一种:登录linux,在终端输入 cat /proc/version
第二种:登录linux,在终端输入 uname -a 即列出linux的内核版本号
第三种:在Linux终端输入 unmae -r 即可查看linux的内核版本号
查看linux版本信息:
第一种:登录到linux服务器执行 lsb_release-a 命令,即可查看所有版本信息
第二种:登录到linux执行 cat /etc/issue (切记cat后要空一格)
7、参考文档
主要参考文档:
Docker 中文教程 http://wiki.jikexueyuan.com/project/docker/
其他参考文档:
容器技术爱好者博客(不错的一个博客,推荐) http://blog.youkuaiyun.com/horsefoot
GitLab搭建与维护(基于docker镜像sameersbn/docker-gitlab) http://www.tuicool.com/articles/bYbi2mJ
How to get into a docker container? http://stackoverflow.com/questions/30172605/how-to-get-into-a-docker-container
csdn知识图谱 http://lib.youkuaiyun.com/base/docker/structure
10张图带你深入理解Docker容器和镜像 http://blog.youkuaiyun.com/x931100537/article/details/49633107
docker手册-中文版.pdf