docker


联合文件系统
分层
docker镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部
这一层就是我们所说的容器层,容器之下的都叫镜像层


镜像

1
2
3
4
5
6
7
8
9
docker version 					显示docker版本
docker images 查看镜像文件
-a 列出所有镜像
-q 只显示镜像id
docker search ID 搜索镜像
docker pull 下载镜像
docker pull mysq:5.7 下载指定版本容器
docker rmi -f ID 删除指定容器
docker rmi -f $(docker images -aq) 批量删除所有的容器

容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
docker run [可选参数] image 		启动镜像
--name='Name' 自定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器
-p 指定容器端口 -p 8080:8080 目标端口:原端口
-P 随机指定端口
-e 环境配置修改
docker run -it centos /bin/bash 启动进入容器
docker ps -a 查看所有运行的容器
docker ps 查看当前运行的容器
docker ps -aq 显示所有运行容器的id
docker rmi ID 删除指定镜像
docker rm ID 移除指定容器
docker rm -f $(docker ps -aq) 移除所有容器
docker ps -aq | xargs docker rm
启动/停止:
docker start ID 启动容器
docker restart ID 重启容器
docker stop ID 停止当前在运行的容器
docker kill ID 强制杀掉容器
docker stats ID 查看服务运行状态

常用的其他命令:
docker run -d centos 后台启动,容器发现没有提供服务就会自杀
docker logs 查看日志
docker top ID 查看docker容器内部信息
docker inspect ID 查看镜像源数据(容器、网络、参数等信息)

进入当前运行容器:
docker exec -it ID /bin/bash 进入容器内部(开启新终端)
docker attch ID 进入容器(容器正在执行的终端)
docker cp id:容器内部路径 外部主机路径 从容器拷贝文件到外主机
(docker cp 146ecba301d4:/home/jiangxu.txt ./)

commit镜像
docker commit ID 提交容器成为新的副本
docker commit -m “提交描述信息” -a="作者" 容器id 目标镜像名:[tag]
dokcer commit -m="add webapps" -a="jiangxu" 90bde776f89f tomcat:V1
docker history 0d120b6ccaa8 查看镜像构建历史

数据卷

多容器同步数据

1
2
3
4
5
6
docker run --name docker01 -itd liujiangxu-centos
docker run --name docker02 -itd --volumes-from docker01 liujiangxu-centos
docker run --name docker03 -itd --volumes-from docker01 liujiangxu-centos
docker01 docker02 docker03 三台容器卷共享
--volumes-from
docker01删除不会影响其他数据同步效果

三种挂载方式

1
2
3
4
5
6
7
8
9
-v 			容器内路径 #匿名挂载
docker run -d -P --name=nginx01 -v juming-nginx:/etc/nginx:ro nginx ro:可读
docker run -d -P --name=nginx01 -v juming-nginx:/etc/nginx:rw nginx rw:读写
-v 卷名:容器内路径 #具名挂载
docker run -d -P -v juming-nginx:/etc/nginx nginx 具名挂载
-v 宿主机路径:容器内路径 #指定路径挂载
docker run -it -v /home/ceshi:/home/ceshi centos /bin/bash (主机目录:容器目录)

所有docker容器中,没有指定目录情况下都在/var/lib/docker/volumes/XXX/_data

dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker build -f dockerfile1 -t liujiangxu-centos . 构建dockerfile -f 指定文件 -t 设定后目标
#
FROM centos
VOLUME ["volume01"]
CMD echo "----end-----"
CMD /bin/bash

DOCKERFILE命令:
FROM 基础镜像
MAINTAINER 维护者信息
RUN 构建时需要运行的命令
ADD COPY文件,比如将本地tomcat添加到容器
WORKDIR 设置当前工作目录
VOLUME 设置卷,挂载主机目录
EXPOSE 暴漏端口配置
CMD 指定容器启动运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT 指定容器启动运行的命令,可以追加命令
ONBUILD 当构建一个被继承dockerfile时候运行的指令,触发指令
COPY 类似ADD ,将文件拷贝镜像中
ENV 构建时设置环境变量

docker网络:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
每启动一个容器,docker就会给容器分配一个ip,只要安装docker,就会有一个网卡docker0
桥接模式:使用的技术是evth-pair技术
evth-pair:一对虚拟的设备接口,都是成对出现的(容器带来的网卡都是一对一对的)
容器和容器之间是可以互相ping通

所有的容器在不指定的情况下,都是docker0路由的,docker会分配默认的可用ip
--link
类似与将ip 服务名写入到/etc/hosts文件
docker -itd -P --name tomcat02 --link tomcat01 tomcat
docker exec -it tomcat02 ping tomcat01 可以通过服务名ping通另一台容器
• 但tomcat01ping服务名tomcat02是不行

自定义网络:容器互连
docker network ls 查看容器网络状况
网络模式:
bridge: 桥接模式
host: 主机模式
container: 容器网络连通
none: 不配置网络
直接启动的命令默认参数 --net bridge
docker run -itd -P --name tomcat01 --net bridge tomcat

创建自定义网络:(创建子网掩码16 网关为192.168.0.1 名称为mynet 的桥接模式网络)
docker network create mynet --subnet 192.168.0.0/16 --gateway 192.168.0.1
--dirver bridge 设置网络模式桥接
--subnet 192.168.0.0/16 设置子网
--gateway 192.168.0.1 设置网关

启动容器设置为自己设置的自定义网络:
docker run -d -P --name tomcat01 --net mynet tomcat
• 网络相互连通
• 服务名正常ping通

不同网络模式容器连通:connect(连接)
docker network connect mynet tomcat01-delfaut
将整个mynet网络增加到默认网络tomcat01-delfaut的容器中

docker swarm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
初始化节点:
docker swarm init --advertise-addr 192.168.108.130
其他主机加入节点:
docker swarm join --token SWMTKN-1-4pglq5modcssvddg0iwtg1n37sewh30pftf3osl97wjmxwl279-ahoa9ba936d416ip5n466cxr4 192.168.108.130:2377
生成主节点令牌:
docker swarm join-token manager
生成工作节点令牌
docker swarm join-token worker
查看节点:
docker node ls
离开集群:
docker swarm leave (在想要离开的本机执行即可)
docker node demote (先降级)
docker node rm ID (先离开 降级 删除节点)
节点升降级:
dockr node update --role=worker HOSTNAME 降级工作节点
docker node update --role=manager HOSTNAME 升级为管理节点
docker node demote HOSTNAME 降级主机
docker node promote HOSTNAME 升级主机

以volume卷挂载:
docker service create --mount type=volume,src=nginx-vol,dst=/usr/local/nginx/html \
--replicas=2 --name nginx-test nginx
查看卷:
docker volume ls

docker service create -p 8888:80 --name my-nginx nginx 创建一个nginx服务
docker service rm my-nginx 删除服务
docker service ls 查看启动的服务
docker service ps my-nginx 查看那些节点使用my-nginx服务
docker service 动态扩缩容
--replicas 3 副本==3容器
docker service update --replicas 3 my-nginx
docker service scale my-nginx=3
在集群中扩容3个my-nginx容器(当集群某节点宕机将会将会自动拉起副本不少于3)
调整sservice以什么方式运行
--mode string
docker service create --mode replicated --name mytom tomcat:7 (工作,集群分配工作节点运行)
docker service create --mode global --name mytom tomcat:7(全局,集群随机分配运行)