Docker
Docker作为C/S架构的应用,docker客户端只需要向docker服务端或守护进程发出请求,服务端将完成请求并返回所有工作并返回结果。docker提供了一个命令行工具docker以及一整套RESTful API。
核心组件:
docker client:docker的客户端工具,是用户使用docker的主要接口,docker client与docker daemon通信并将结果返回给用户
docker daemon:运行于宿主机,docker守护进程,用户可通过docker client与其交互
image:镜像文件是只读的;用来创建container,一个镜像可以运行多个container;镜像文件可以通过Dockerfile文件创建,也可以从docker hub/registry下载
repository
- 公共仓库:Docker hub/registry
- 私用仓库:docker registry
docker container:docker的运行实例,容器是一个隔离环境;
docker安装
docker有一些先绝条件:
- docker不支持32bitCPU
- 运行Linux 3.8或更高内核,一些老的2.6.x或其后的内核可以运行docker,但运行结果会有很大的不同。
- 内核必须支持一种适合的存储驱动:device mapper,aufs,vfs,btrfs
- 内核必须支持并开启cgroup和命名空间
检查内核和cpu
1
~]# uname -a
2
Linux INIT 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
检查device mapper
aufs默认不存在linux内核中,而早期docker强依赖aufs,但是目前ubuntu是支持aufs的,但作为企业服务器的redhat不支持,所以研发了一款替代aufs的device mapper。1
~]# grep device-mapper /proc/devices
2
253 device-mapper
如果不存在,我们需要做的是:
1 | ~]# yum install -y device-mapper |
2 | ~]# modprode dm_mod |
- 安装docker
这其中centos6与centos7又有不同,centos6的docker来之epel源,而centos7来之extras源中,所以centos6默认不支持docker的,我们需要安装epel源。
centos6
1 | ~]# yum install -y docker-io |
centos7
1 | ~]# yum install -y docker |
但是强烈建议在centos7上部署docker,在centos7上内核技术才逐渐成熟,centos6上可能会遇见不少的坑。
- 启动docker
1
~]# systemctl start docker
2
~]# ip addr show docker0
3
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
4
link/ether 02:42:ef:69:ff:b0 brd ff:ff:ff:ff:ff:ff
5
inet 172.17.0.1/16 scope global docker0
6
valid_lft forever preferred_lft forever
这样docker就启动完成了,会出现一个docker0的桥,这也就意味着docker网络默认为nat网络。
配置docker镜像加速
因为国情的原因,国内下载Docker HUB官方的相关镜像很慢,比如ali的docker加速站点:
1 | ~]# cd /etc/docker |
2 | ~]# cat > daemon.json << EOF |
3 | { |
4 | "registry-mirrors": ["https://02enzqew.mirror.aliyuncs.com"] |
5 | } |
6 | EOF |
7 | ~]# systemctl daemon-reload |
8 | ~]# systemctl restart docker |
docker 运行一个容器
搜索镜像 docker search
1
[root@INIT docker]# docker search centos
2
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
3
docker.io docker.io/centos The official build of CentOS. 3587 [OK]
4
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 100 [OK]
5
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8... 81 [OK]
6
docker.io docker.io/tutum/centos Simple CentOS docker image with SSH access 33
7
docker.io docker.io/imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 30 [OK]
8
....
我们没加tag,默认给我们加的标签为latest,所以默认我们下载的都是centos7的,如果需要下载centos6
docker search centos:6
加上6的标签,这些镜像源我们都是从Docker HUB上获取的,STARS 是受欢迎的程度,OFFICIAL是标识为官方的base镜像。拉取镜像 docker pull
1
[root@INIT docker]# docker pull centos
2
Using default tag: latest
3
Trying to pull repository docker.io/library/centos ...
4
latest: Pulling from docker.io/library/centos
5
74f0853ba93b: Pull complete
6
Digest: sha256:26f74cefad82967f97f3eeeef88c1b6262f9b42bc96f2ad61d6f3fdf544759b8
查看镜像 docker images
1
[root@INIT docker]# docker images
2
REPOSITORY TAG IMAGE ID CREATED SIZE
3
docker.io/busybox latest d20ae45477cb 3 days ago 1.129 MB
4
docker.io/centos latest 328edcd84f1b 3 weeks ago 192.5 MB
运行容器 docker run
1
[root@INIT docker]# docker run -it --name centos7 centos:latest /bin/bash
2
[root@3f6c9ac56534 /]#
docker的运行必须有任务运行,任务结束,容器也就结束了。
- -t:分配一个(伪)终端tty
- -i:交互模式
- –name:给容器命名
- /bin/bash:运行一个shell,这就是我们分配给容器的任务
- –rm:当任务结束了,就删除这个容器
查看容器 docker ps
1
[root@INIT docker]# docker ps -a
2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3
3f6c9ac56534 centos:latest "/bin/bash" 11 hours ago Up 6 minutes centos7
可能这里我们会按照上面的方法进入了一个伪终端,当我们exit退出的时候,容器也就结束了,告诉一个小技巧:
退出:Ctrl+D exit 退出容器
detach:Ctrl+P + Ctrl+Q 分开一个容器,不会停止容器
attach: docker attach CONTAINER-ID 附上一个容器删除容器 docker rm
1
[root@INIT docker]# docker stop 3f6c9ac56534
2
3f6c9ac56534
3
[root@INIT docker]# docker rm 3f6c9ac56534
4
3f6c9ac56534
5
[root@INIT docker]# docker ps -a
6
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
删除镜像 docker rmi
1
[root@INIT docker]# docker images
2
REPOSITORY TAG IMAGE ID CREATED SIZE
3
docker.io/busybox latest d20ae45477cb 3 days ago 1.129 MB
4
docker.io/centos latest 328edcd84f1b 3 weeks ago 192.5 MB
5
[root@INIT docker]# docker rmi busybox:latest
6
Untagged: busybox:latest
7
Untagged: docker.io/busybox@sha256:b82b5740006c1ab823596d2c07f081084ecdb32fd258072707b99f52a3cb8692
8
Deleted: sha256:d20ae45477cbc89863fff11d01cdccf28e4ff06ce2eb2f0206ef971b14eaf6c0
9
Deleted: sha256:6a749002dd6a65988a6696ca4d0c4cbe87145df74e3bf6feae4025ab28f420f2
10
[root@INIT docker]# docker images
11
REPOSITORY TAG IMAGE ID CREATED SIZE
12
docker.io/centos latest 328edcd84f1b 3 weeks ago 192.5 MB
基本的使用也就这样了,docker的使用还是很简单的。
Docker help
1 | ~]# docker -h |
2 | Commands: |
3 | attach Attach to a running container #在当前shell下附上一个正在运行的容器 |
4 | build Build an image from a Dockerfile #通过Dockerfile定制一个镜像 |
5 | commit Create a new image from a container's changes #提交当前容器为新的镜像 |
6 | cp Copy files/folders between a container and the local filesystem #在容器与宿主机的文件系统之间拷贝文件或目录 |
7 | create Create a new container #创建一个新的容器,同run,但不启动容器 |
8 | diff Inspect changes on a container's filesystem #查看docker容器文件系统的变化 |
9 | events Get real time events from the server #从docker服务中获取容器的实时事件 |
10 | exec Run a command in a running container #在已运行的容器中运行命令 |
11 | export Export a container's filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import] |
12 | history Show the history of an image #展示一个镜像的形成历史 |
13 | images List images #列出系统的当前镜像 |
14 | import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统镜像[对于export] |
15 | info Display system-wide information #显示系统的相关信息 |
16 | inspect Return low-level information on a container, image or task #返回在一个容器,镜像或任务的低级的信息输出 |
17 | kill Kill one or more running containers #kill一个或多个容器 |
18 | load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像[对应save] |
19 | login Log in to a Docker registry. #登陆一个docker源仓库 |
20 | logout Log out from a Docker registry. #登出一个docker源仓库 |
21 | logs Fetch the logs of a container #输出容器的日志信息 |
22 | network Manage Docker networks #管理doker网络 |
23 | node Manage Docker Swarm nodes #管理docker swarm节点 |
24 | pause Pause all processes within one or more containers #暂停容器 |
25 | port List port mappings or a specific mapping for the container #查看映射端口对应的容器内部源端口 |
26 | ps List containers #列出容器 |
27 | pull Pull an image or a repository from a registry #从一个docker源服务器拉取一个镜像 |
28 | push Push an image or a repository to a registry #将一个镜像推送到一个docker源服务器 |
29 | rename Rename a container #重命名一个容器 |
30 | restart Restart a container #重启一个容器 |
31 | rm Remove one or more containers #删除一个容器 |
32 | rmi Remove one or more images #删除一个镜像 |
33 | run Run a command in a new container #在一个新的容器运行一个任务 |
34 | save Save one or more images to a tar archive (streamed to STDOUT by default) #保存一个镜像到一个tar包[对于load] |
35 | search Search the Docker Hub for images #从docker hub搜索镜像 |
36 | service Manage Docker services #管理docker服务(swarm) |
37 | start Start one or more stopped containers #启动一个停止的容器 |
38 | stats Display a live stream of container(s) resource usage statistics #显示容器资源使用统计数据数据流 |
39 | stop Stop one or more running containers #停止一个正在运行的容器 |
40 | swarm Manage Docker Swarm #管理docker swarm集群 |
41 | tag Tag an image into a repository #给源中镜像打标签 |
42 | top Display the running processes of a container #列出一个容器正在运行进程 |
43 | unpause Unpause all processes within one or more containers #取消暂停的容器 |
44 | update Update configuration of one or more containers #更新容器的配置 |
45 | version Show the Docker version information #展示docker的版本信息 |
46 | volume Manage Docker volumes #管理docker卷 |
47 | wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值 |
docker run 的一些参数:
- –add-host 添加hosts host:ip
- -a,– –attach=[] 附上标准输入,标准输出或错误输出,-ia 可以不启动进入容器
- -c,– –cpu-shares int 设置cpu使用权重
- –cap-add value 添加linux功能
- –cap-drop value 去掉linux功能
- –cidfile string 把容器id写入到指定文件
- –cpuset-cpus string 绑定cpu
- –cpuset-mems string 版定使用mem的cpu
- -d,–detach 后台运行容器
- –device value 添加宿主的设备到容器
- –device-read-bps value 限制一个设备的每秒的读速率(bytes per second)
- –device-read-iops value 限制一个设备的每秒的读速率(IO per second)
- –device-write-bps value 限制一个设备的每秒的写速率(bytes per second)
- –device-write-iops value 限制一个设备的每秒的写速率(IO per second)
- –dns value 设置dns
- -e,–env value 设置环境变量
- –env-file value 从文件中读取环境变量
- –expose value 指定对外提供服务的端口
- -h,–hostname string 容器的主机名
- -i,–interactive 尽管没有附上容器保持标准输出
- –link value 添加链接到另一个容器
- –ip value 容器的ip地址
- –link-local-ip value 链接本地的ip
- –mac-address string 容器的mac地址
- -m,–memory string 内存限制
- –memory-reservation string 内存软限制
- –memory-swap string swap限制与内存的正比 ‘-1’表示不限制使用swap
- –memory-swappiness int 调整容器的swappiness 默认-1
- –name string 分配容器一个名字
- –network 设置容器的网络 默认default 也就是nat
- -p,–publish value 指定端口映射
- -P,–publish-all 自动映射容器对外提供服务的端口
- –read-only 挂载容器的根文件系统为只读
- –restart string 当容器退出重新开启(default=no 可以设置always)
- –rm 当容器退出自动删除容器
- –sysctl value sysctl选项
- -t,–tty 分配伪终端
- –ulimit value ulimit选项
- -u,–user string 指定运行容器的用户或uid(format: name|uid[:group|gid])
- -v,–volume value 挂载数据卷
- –volumes-from 挂载卷从特殊的数据容器
- -w,–workdir string 指定容器的工作目录
By default all groups have 1024 shares. A group with 100 shares will get a ~10% portion of the CPU time - archlinux cgroups