Docker基本使用
1.什么是docker
Docker 最初是 dotCloud 公司创始⼈ 在法国期间发起的⼀个公司内部项⽬,它是基于 dotCloud 公司多年云服务技术的⼀次⾰新,并于 ,主要项⽬代码在 上进⾏维护。Docker 项⽬后来还加⼊ 了 Linux 基⾦会,并成⽴推动 。 Docker ⾃开源后受到⼴泛的关注和讨论,⾄今其 已经超过 5 万 7 千个星标和⼀万多个 fork。甚 ⾄由于 Docker 项⽬的⽕爆,在 2013 年底,。Docker 最初是在 Ubuntu 12.04 上开发实现的; Red Hat 则从 RHEL 6.5 开始对 Docker 进⾏⽀持;Google 也在其 PaaS 产品中⼴泛应⽤ Docker。
2.为什么要用Docker
作为⼀种新兴的虚拟化⽅式,Docker 跟传统的虚拟化⽅式相⽐具有众多的优势
更⾼效的利⽤系统资源
由于容器不需要进⾏硬件虚拟以及运⾏完整操作系统等额外开销,Docker 对系统资源的利⽤率更 ⾼。⽆论是应⽤执⾏速度、内存损耗或者⽂件存储速度,都要⽐传统虚拟机技术更⾼效。因此,相 ⽐虚拟机技术,⼀个相同配置的主机,往往可以运⾏更多数量的应⽤。
更快速的启动时间
传统的虚拟机技术启动应⽤服务往往需要数分钟,⽽ Docker 容器应⽤,由于直接运⾏于宿主内 核,⽆需启动完整的操作系统,因此可以做到秒级、甚⾄毫秒级的启动时间。⼤⼤的节约了开发、 测试、部署的时间。
⼀致的运⾏环境
开发过程中⼀个常⻅的问题是环境⼀致性问题。由于开发环境、测试环境、⽣产环境不⼀致,导致 有些 bug 并未在开发过程中被发现。⽽ Docker 的镜像提供了除内核外完整的运⾏时环境,确保 了应⽤运⾏环境⼀致性,从⽽不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维()⼈员来说,最希望的就是⼀次创建或配置,可以在任意地⽅正常运⾏。 为什么要⽤ Docker 4 使⽤ Docker 可以通过定制应⽤镜像来实现持续集成、持续交付、部署。开发⼈员可以通过 来进 ⾏镜像构建,并结合 系统进⾏集成测试,⽽运维⼈员则可以直接在⽣产环境中快速部署该镜像, 甚⾄结合 系统进⾏⾃动部署。 ⽽且使⽤ 使镜像构建透明化,不仅仅开发团队可以理解应⽤运⾏环境,也⽅便运维团队理解应⽤ 运⾏所需条件,帮助更好的⽣产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执⾏环境的⼀致性,使得应⽤的迁移更加容易。Docker 可以在很多平台上运 ⾏,⽆论是物理机、虚拟机、公有云、私有云,甚⾄是笔记本,其运⾏结果是⼀致的。因此⽤户可 以很轻易的将在⼀个平台上运⾏的应⽤,迁移到另⼀个平台上,⽽不⽤担⼼运⾏环境的变化导致应 ⽤⽆法正常运⾏的情况。
更轻松的维护和扩展
Docker 使⽤的分层存储以及镜像的技术,使得应⽤重复部分的复⽤更为容易,也使得应⽤的维护 更新更加简单,基于基础镜像进⼀步扩展镜像也变得⾮常简单。此外,Docker 团队同各个开源项 ⽬团队⼀起维护了⼀⼤批⾼质量的 ,既可以直接在⽣产环境使⽤,⼜可以作为基础进⼀步定制, ⼤⼤的降低了应⽤服务的镜像制作成本。
docker安装
关闭firewalld
[root@docker ~]# systemctl stop firewalld
[root@docker ~]# systemctl disable firewalld
关闭selinux
[root@docker ~]# setenforce 0
[root@docker ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/selinux/config
安装docker
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data
lvm2
添加软件源信息。
[root@docker ~]# yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新并安装 Docker-CE。
[root@docker ~]# yum makecache fast
[root@docker ~]# yum list docker-ce --showduplicates | sort -r
[root@docker ~]# yum -y install docker-ce 安装docker最新版
开启docker服务。
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker
[root@docker ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multiuser.target.wants/docker.service to
/usr/lib/systemd/system/docker.service.
docker⼀键安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
Docker命令实战
1、镜像 下载最新版镜像
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
7d63c13d9b9b: Pull complete
5cb019b641b5: Pull complete
d477de77abf8: Pull complete
c60e7d4c1c30: Pull complete
365a49996569: Pull complete
039c6e901970: Pull complete
Digest:
sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
查看本地镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.0.1 2800fc93554b 2 days ago 140MB
registry.cn-hangzhou.aliyuncs.com/vm1/test 1.0.1 2800fc93554b 2 days ago 140MB
myapp v1.0 607dc55bb1c0 2 days ago
给镜像打标签
[root@docker ~]# docker tag 2800fc93554b docke.io/xmfree/alpine:v3.12.2
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docke.io/xmfree/alpine v3.12.2 2800fc93554b 2 days ago 140MB
nginx 1.0.1 2800fc93554b 2 days ago 140MB
registry.cn-hangzhou.aliyuncs.com/vm1/test 1.0.1 2800fc93554b 2 days ago 140MB
myapp v1.0 607dc55bb1c0 2 days ago 142MB
容器类命令
拉取和运行
docker pull centos #拉取镜像,有镜像才能运行容器
docker run [可选参数] images
#参数说明
--name="Name" 容器名称,nginx,tomcat1。
-d 后台运行
-it 使用交互方式运行/进入容器查看内容
-p 指定容器端口, 80:80
-P 随机指定端口
docker run -it centos /bin/bash #以前台交互的模式启动并进入容器
docker run -d centos #以后台守护式启动
Ctrl + P + Q #退出容器并在后台运行
列出运行的容器
docker ps #列出当前正在运行的容器
-a #列出全部容器
-n [数字] #列出最近的n个容器
-q #只显示容器的编号
退出容器
exit #退出容器
ctrl+P+Q #退出并继续运行容器
删除容器
docker rmi 容器id #删除指定容器,但无法删除正在运行的容器
docker rmi -rf 容器id #强制删除
docker rmi -f $(docker ps -aq) #递归删除所有启动/启动过的容器
docker ps -a|xargs docker rmi #递归删除所有容器
启动和停止容器
docker start|restart|stop|kill 容器id #启动|重启|停止|杀掉 容器
查看日志
docker logs 容器ID #查看容器日志
docker logs -tf --tail 10 容器ID #查看容器前10行的日志
--tail number #显示日志条数
查看容器的进程信息
docker top 容器ID
进入当前正在运行的容器
docker exec -it 容器ID /bin/bash #以交互形式进入容器,类似新开一个界面
#exec 使用exit进入退出不会停止
docker attach -it 5d8e48e4b792 #进入正在运行的容器命令行
#attach 退出了会停止容器
镜像的保存与导入
docker save -o test.tar myapp:v0.1 #保存镜像
docker save fe8c52043b39 > test.tar #保存镜像
#此时就会创建一个tar包,其中就是镜像文件
docker load < test.tar #导入镜像
docker load -i test.tar #导入镜像
#将tar包导入,就可以运行使用了。
容器文件拷贝到主机上
#在主机上输入该命令
docker cp 容器ID:文件路径 目的主机路径
容器备份与解压
备份运行时的容器镜像
docker export 517d619c4d55 > test.tar #将你的整个容器做成tar备份
cat test.tar | docker import - test/redis:0.1 #将tar备份文件转换为可用镜像
下载指定版本镜像
[root@docker ~]# docker pull nginx:1.20.2
1.20.2: Pulling from library/nginx
1fe172e4850f: Already exists
c02d3377f583: Pull complete
786a9523d165: Pull complete
10fc07fe64d1: Pull complete
2f1ad5471016: Pull complete
040415d7474c: Pull complete
Digest: sha256:7dfea820d4c89037c6475c36567fcd439d54fe3810f459cbf580061c659b0dd6
Status: Downloaded newer image for nginx:1.20.2
docker.io/library/nginx:1.20.2
容器
启动nginx容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
【docker run 设置项 镜像名 】 镜像启动运⾏的命令(镜像⾥⾯默认有的,⼀般不会写)
- -i:交互式操作
- -t:终端;
- d:容器在后台运⾏;
- -p:端⼝映射;
- —restart=always: 开机⾃启
- —name:为容器指定⼀个名称;
指明了-d运⾏镜像,会返回容器id;如果不指明-d运⾏镜像,会打印出catalina.out的⽇志,在 [crtl+c]后,容器即停⽌运⾏。 ``` [root@docker ~]# docker run —name=myningx -d —restart=always -p 88:80 nginx Unable to find image ‘nginx:latest’ locally latest: Pulling from library/nginx 7d63c13d9b9b: Pull complete 5cb019b641b5: Pull complete d477de77abf8: Pull complete c60e7d4c1c30: Pull complete 365a49996569: Pull complete 039c6e901970: Pull complete Digest: sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288 Status: Downloaded newer image for nginx:latest 15db0ba492cf2b86714e3e29723d413b97e64cc2ee361d4109f4216b2e0cba60
[root@docker ~]# curl -I 127.0.0.1:88 HTTP/1.1 200 OK Server: nginx/1.21.6 Date: Fri, 06 May 2022 10:24:37 GMT Content-Type: text/html Content-Length: 4 Last-Modified: Wed, 04 May 2022 08:36:54 GMT Connection: keep-alive ETag: “62723b26-4” Accept-Ranges: bytes
![image-20220506182548883.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844005997-3689fff5-d347-457d-aed9-24bba26bbce5.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u8ab466ca&margin=%5Bobject%20Object%5D&name=image-20220506182548883.png&originHeight=201&originWidth=363&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10669&status=done&style=none&taskId=ue4cb25e5-25b8-43d7-be45-b0b7f8d1647&title=)
<a name="cf1eebd9"></a>
#### 查看当前运行的容器
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba7518c38bd5 nginx “/docker-entrypoint.…” 2 days ago Up 2 hours 0.0.0.0:88->80/tcp, :::88->80/tcp myningx
<a name="bfc829cd"></a>
#### 根据启动的容器创建新的镜像
[root@docker ~]# docker commit -a “cool” -m “this is test” ba7518c38bd5 nginx:1.1 sha256:b9d5e0d36529cc9e778e6273e53bd470c73338002828ed8e4b426687ba647a71
![image-20220506183012686.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844052345-adc269a1-7566-45a6-9d6d-051fb63283e6.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uc12a15d7&margin=%5Bobject%20Object%5D&name=image-20220506183012686.png&originHeight=324&originWidth=795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=39820&status=done&style=none&taskId=u06480578-28e9-445f-b660-ddb4621b0c5&title=)
<a name="fc669bfc"></a>
#### **docker commit : 从容器创建⼀个新的镜像**
- a:提交的镜像作者;
- -c:使⽤Dockerfile指令来创建镜像;
- m:提交时的说明⽂字;
- p:在commit时,将容器暂停。
<a name="fb410b16"></a>
#### 进入容器操作容器
[root@docker ~]# docker exec -it ba7518c38bd5 /bin/bash root@ba7518c38bd5:/# echo “123” > /usr/share/nginx/html/index.html
[root@docker ~]# curl 127.0.0.1:88 123
![image-20220506183503372.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844075539-308c173a-a2aa-4979-88d3-6b7c8315e648.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u2de63549&margin=%5Bobject%20Object%5D&name=image-20220506183503372.png&originHeight=213&originWidth=593&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16897&status=done&style=none&taskId=uc22c2256-ec40-4a78-b347-55906f79e30&title=)
<a name="aba257eb"></a>
#### 将运行中的容器构建为镜像
[root@docker ~]# docker commit -a “cby” -m “my app” ba7518c38bd5 meapp:v1.0 sha256:c92b8d5a695971d7b3b73bc90fa8d3bcd297c17a4f78798aa1238b5fbda181c3
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE meapp v1.0 c92b8d5a6959 7 seconds ago 142MB nginx 1.1 b9d5e0d36529 8 minutes ago 142MB test/redis 0.1 1c011895a942 25 minutes ago 140MB docke.io/xmfree/alpine v3.12.2 2800fc93554b 2 days ago 140MB nginx 1.0.1 2800fc93554b 2 days ago 140MB
![image-20220506183809133.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844104556-bfa9e596-5780-4bfa-913b-53673b80b258.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=udf539ad7&margin=%5Bobject%20Object%5D&name=image-20220506183809133.png&originHeight=344&originWidth=757&originalType=binary&ratio=1&rotation=0&showTitle=false&size=41900&status=done&style=none&taskId=uad389418-07c1-482e-9140-b13dbb1eee7&title=)
<a name="b07ec552"></a>
#### 镜像保存与导入
[root@docker ~]# docker save -o cby.tar meapp:v1.0 [root@docker ~]# docker save c92b8d5a6959 > cby.tar [root@docker ~]# ll cby.tar -rw———-. 1 root root 145967616 5月 6 18:39 cby.tar [root@docker ~]# docker load -i cby.tar Loaded image ID: sha256:c92b8d5a695971d7b3b73bc90fa8d3bcd297c17a4f78798aa1238b5fbda181c3 [root@docker ~]# docker load < cby.tar Loaded image ID: sha256:c92b8d5a695971d7b3b73bc90fa8d3bcd297c17a4f78798aa1238b5fbda181c3
![image-20220506184214045.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844119672-3dd5a9bd-1e60-444f-85e2-5caa2a3d0f0e.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u70f09ba0&margin=%5Bobject%20Object%5D&name=image-20220506184214045.png&originHeight=440&originWidth=773&originalType=binary&ratio=1&rotation=0&showTitle=false&size=52673&status=done&style=none&taskId=uc7b27971-1937-43de-80b8-cb98dcd00b5&title=)
<a name="9d1217a1"></a>
#### 容器导出和导入
容器导出<br />#这样将导出容器快照到本地⽂件<br />docker export [CONTAINER ID] > [tar file]
[root@docker ~]# docker export ba7518c38bd5 > nginx.1.0.tar [root@docker ~]# ls anaconda-ks.cfg cby.tar nginx.1.0.tar test.tar
![image-20220506201815129.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844148942-bf2d5843-45af-4280-94ee-5022cfd3eb62.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u09c27626&margin=%5Bobject%20Object%5D&name=image-20220506201815129.png&originHeight=155&originWidth=797&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13715&status=done&style=none&taskId=u81ba278b-19bf-47c3-b659-05cffad8ad9&title=)<br />容器导入<br />#从容器快照⽂件中再导⼊为镜像<br />cat [tar file] | docker import - [name:tag]、
[root@docker ~]# docker import nginx.1.0.tar nginx:1.0.2 sha256:18e19572d1b4f384950dfa3cc78abbc18993c5332a40853ef30861cef31027b5
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.0.2 18e19572d1b4 9 seconds ago 140MB meapp v1.0 c92b8d5a6959 2 hours ago 142MB nginx 1.1 b9d5e0d36529 2 hours ago 142MB
![image-20220506202153574.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844171526-b18826a2-28a8-4055-a332-810cf05a97c7.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u009631c1&margin=%5Bobject%20Object%5D&name=image-20220506202153574.png&originHeight=360&originWidth=797&originalType=binary&ratio=1&rotation=0&showTitle=false&size=43348&status=done&style=none&taskId=uead6a5be-ea66-420f-ac96-0587ce2ca69&title=)
<a name="3cffc2d6"></a>
#### 镜像和容器 导出和导入的区别
**1.镜像导⼊ 是复制的过程**<br />**2.容器导⼊ 是将当前容器 变成⼀个新的镜像**<br />**save 和 export区别:**<br />**1)save 保存镜像所有的信息-包含历史**<br />**2)export 只导出当前的信息**
<a name="4de69e5f"></a>
#### 容器数据管理
⽣产环境使⽤Docker的过程中,往往需要对数据进⾏持久化保存,或者需要更多容器之间进⾏数 据共享,此时运⽤到数据卷(Data Volumes)和数据卷容器(Data Volume Contain)<br />**数据卷**<br />数据卷就是将宿主机的某个⽬录,映射到容器中,作为数据存储的⽬录,我们就可以在宿主机对数 据进⾏存储。<br />数据卷(Data Volumes):容器内数据映射到本地主机环境。<br />1.数据卷可以在容器之间共享和重⽤,本地与容器间传递数据更搞笑;<br />2.对数据卷的修改会⽴⻢有效,容器内部与本地⽬录均可;<br />3.对数据卷的更新,不会影响镜像,对数据与应⽤进⾏了解耦操作;<br />4.数据卷默认会⼀直存在,即使容器被删除。<br />命令格式: docker run -dti --name [容器名字] -v [宿主机⽬录]:[容器⽬录] [镜像名称] [命令(可 选)]
[root@docker ~]# mkdir /date [root@docker ~]# echo “test” > /date/test.txt #创建一个test文件 [root@docker ~]# docker run -dti —name test -v /date/:/date/ nginx #启动⼀个容器,挂载数据卷 e9f4095f8b2577d6d293cbf3e677d1b8b00132e410142173b00767642cc27007 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e9f4095f8b25 nginx “/docker-entrypoint.…” 7 seconds ago Up 6 seconds 80/tcp test ba7518c38bd5 nginx “/docker-entrypoint.…” 2 days ago Up 4 hours 0.0.0.0:88->80/tcp, :::88->80/tcp myningx [root@docker ~]# docker exec -it e9f4095f8b25 /bin/bash root@e9f4095f8b25:/# cat /date/test.txt test root@e9f4095f8b25:/#
**注意:**<br />1、Docker挂载数据卷的默认读写权限(rw),⽤户可以通过ro设置为只读,格式:[宿主机⽂件]: [容器⽂件]:ro<br />2、如果直接挂载⼀个⽂件到容器,使⽤⽂件⼯具进⾏编辑,可能会造成⽂件的改变,从 Docker1.1.0起,这会导致报错误信息。所以推荐的⽅式是直接挂载⽂件所在的⽬录。
<a name="2df5c8a6"></a>
#### 数据卷容器
数据卷容器需要再多个容器之间共享⼀些持续更新的数据,最简单的⽅式是使⽤数据卷容器。数据 卷容器也是⼀个容器,但是它的⽬的是专⻔⽤来提供数据卷供其他容器挂载。 数据卷容器(Data Volume Containers):使⽤特定容器维护数据卷。 简单点:数据卷容器就是为其他容器提供数据交互存储的容器。<br />**命令格式:**
- Docker run --help
- -v,--volumes-from list
**数据卷容器操作流程:**<br />如果使⽤数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有⼀个规范的流程才能做 的到:<br />1、创卷数据卷容器<br />2、其他容器挂载数据卷容器<br />注意:数据卷容器⾃身并不需要启动,但是启动的时候仍然可以进⾏数据卷容器的⼯作。<br />**创建⼀个数据卷容器**<br />命令格式:<br />docker create -v [容器数据卷⽬录] --name [容器名字] [镜像名称<br />执⾏效果:
[root@docker ~]# docker create -v /date1 —name v-date1 nginx
37b54805ba9597c9a6c2cf64661462f2b1c5af364087c5c1dbd634b277d9dc88
[root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37b54805ba95 nginx “/docker-entrypoint.…” 8 seconds ago Created v-date1 e9f4095f8b25 nginx “/docker-entrypoint.…” 7 minutes ago Up 7 minutes 80/tcp test
![image-20220506203833032.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844275732-4dd00b1f-3eaa-4e0e-b3d9-f2886d79dacc.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u0e28f87b&margin=%5Bobject%20Object%5D&name=image-20220506203833032.png&originHeight=136&originWidth=892&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12292&status=done&style=none&taskId=u92d6ca7c-cbdd-47d7-bc20-123745dbe4e&title=)<br />**创建两个容器,同时挂载数据卷容器**<br />docker run --volumes-from [数据卷容器id/name] -dti --name [容器名字] [镜像名 称] [命令(可选)]<br />创建v03容器:
[root@docker ~]# docker run —volumes-from v-date1 -dti —name v03 nginx 6edec4ae2d5eeac0cf71e1e5034c1f6fc4541446ea26df6d224e45c3df66b7f3
创建v04容器:
[root@docker ~]# docker run —volumes-from v-date1 -dti —name v04 nginx 3e8becf8bd83c37ca3d3137c9dbe3230dcdd196d37973acbc48fe7887ac29349
列出全部容器:
[root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e8becf8bd83 nginx “/docker-entrypoint.…” 4 seconds ago Up 4 seconds 80/tcp v04 6edec4ae2d5e nginx “/docker-entrypoint.…” 48 seconds ago Up 47 seconds 80/tcp v03 37b54805ba95 nginx “/docker-entrypoint.…” 5 minutes ago Created v-date1 e9f4095f8b25 nginx “/docker-entrypoint.…” 12 minutes ago Up 12 minutes 80/tcp test
![image-20220506204427016.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844304312-60f4e834-92b8-4104-880d-f845b46cee62.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u28f4fdff&margin=%5Bobject%20Object%5D&name=image-20220506204427016.png&originHeight=241&originWidth=825&originalType=binary&ratio=1&rotation=0&showTitle=false&size=20723&status=done&style=none&taskId=ue670e544-0718-48c4-a5f6-88a1598611c&title=)<br />**确认卷容器共享**<br />进入v03,操作数据卷容器:
[root@docker ~]# docker exec -it 6edec4ae2d5e /bin/bash root@6edec4ae2d5e:/# ls /date1/ root@6edec4ae2d5e:/# echo ‘v03’ >/date1/v03.txt root@6edec4ae2d5e:/# exit exit
进入v04,确认数据卷:
[root@docker ~]# docker exec -it 3e8becf8bd83 /bin/bash root@3e8becf8bd83:/# echo ‘v04’ >/date1/v04.txt root@3e8becf8bd83:/# ls /date1/ v03.txt v04.txt
<a name="eb1a46c9"></a>
## Docker 镜像仓库
<a name="37d6c056"></a>
### 本地镜像发布到阿里云
创建自己的docker镜像容器,并且添加到阿里云。将阿里云当成了镜像仓库。
<a name="0769e9f4"></a>
### [容器镜像服务 (aliyun.com)](https://cr.console.aliyun.com/cn-hangzhou/instances)
**创建个人实例**<br />![image-20220506205251671.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844340695-806d82b4-267b-4936-a251-bf6b2f9544a0.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ud5440921&margin=%5Bobject%20Object%5D&name=image-20220506205251671.png&originHeight=359&originWidth=676&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26340&status=done&style=none&taskId=ub4e6842a-437a-4402-a6e8-9b63898b134&title=)
<a name="737f41e9"></a>
##### 创建命名空间
命名空间可以自己随便输入,但是不能和别人重名,并且一个账号最多创建三个。<br />![image-20220506205448259.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844355106-552a9f5e-5e20-4b1c-91ac-5332eb8738ef.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u699abf15&margin=%5Bobject%20Object%5D&name=image-20220506205448259.png&originHeight=284&originWidth=1139&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26304&status=done&style=none&taskId=ua51a3f8c-de79-4cfb-b6ec-8ae4957adda&title=)
<a name="e5d13701"></a>
##### 创建镜像仓库
创建镜像仓库,前面创建的命名空间就起作用了。<br />![image-20220506205656900.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844371679-bc231d94-2d55-42f8-a198-13d8b2822866.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u315b0015&margin=%5Bobject%20Object%5D&name=image-20220506205656900.png&originHeight=391&originWidth=1145&originalType=binary&ratio=1&rotation=0&showTitle=false&size=42077&status=done&style=none&taskId=u9d3ecb4b-7f3a-4a4c-a5fa-a483857e91c&title=)<br />名称和摘要自定义。<br />![image-20220506205743962.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844395620-c6960037-86d3-46d6-ba4b-88db24f5dd1d.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u0db586cb&margin=%5Bobject%20Object%5D&name=image-20220506205743962.png&originHeight=847&originWidth=1145&originalType=binary&ratio=1&rotation=0&showTitle=false&size=63534&status=done&style=none&taskId=udfa3de80-0ef3-4a53-9120-99a7421633d&title=)
<a name="b474c2e0"></a>
##### 添加镜像
创建成功后,按照阿里云上面的教程复制粘贴即可。就比如将镜像推动到Registry。按照要求输入即可。<br />![image-20220506210035136.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844406668-27a8e0c5-578e-407d-9dcf-48ac2515bf0d.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u0d218b76&margin=%5Bobject%20Object%5D&name=image-20220506210035136.png&originHeight=970&originWidth=1909&originalType=binary&ratio=1&rotation=0&showTitle=false&size=115010&status=done&style=none&taskId=ucbc20f8c-2197-41ba-a38a-84841d76820&title=)
注意:此处让输入的密码是设置的docker镜像密码,而不是阿里云密码。<br />![image-20220506210317489.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844422718-b28a21f9-4215-4047-b5b1-8e4e3640b020.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u813fab3a&margin=%5Bobject%20Object%5D&name=image-20220506210317489.png&originHeight=138&originWidth=669&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11560&status=done&style=none&taskId=u03180a08-af54-4755-8e35-7c1f90ca13c&title=)
<a name="7aa049d1"></a>
## 将镜像推送到Registry
[root@docker ~]# docker tag c92b8d5a6959 registry.cn-hangzhou.aliyuncs.com/vm1/test:v1.0 [root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/vm1/test:v1.0 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/vm1/test] 60e4517c593c: Pushed b6812e8d56d6: Pushed 7046505147d7: Pushed c876aa251c80: Pushed f5ab86d69014: Pushed 4b7fffa0f0a4: Pushed 9c1b6dd6c1e6: Pushed v1.0: digest: sha256:4d324d698806a04832b706987cc3b923ca625c3d2ced062624ddc23f24dbb8cd size: 1778 [root@docker ~]#
![image-20220506211005588.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844438955-2da341ad-e0cf-49ed-b86f-521a8ca22f04.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u77265386&margin=%5Bobject%20Object%5D&name=image-20220506211005588.png&originHeight=396&originWidth=1145&originalType=binary&ratio=1&rotation=0&showTitle=false&size=41621&status=done&style=none&taskId=u0dbcacc5-7e6b-4bb0-8926-ac9c9320b04&title=)
<a name="62dbd7c2"></a>
# docker网络
<a name="bf78757a"></a>
## bridge模式
当Docker进程启动时,会在主机上创建⼀个名为docker0的虚拟⽹桥,此主机上启动的 Docker容器会连接到这个虚拟⽹桥上。虚拟⽹桥的⼯作⽅式和物理交换机类似,这样主机上的所 有容器就通过交换机连在了⼀个⼆层⽹络中。
从docker0⼦⽹中分配⼀个IP给容器使⽤,并设置docker0的IP地址为容器的默认⽹关。在主 机上创建⼀对虚拟⽹卡veth pair设备,Docker将veth pair设备的⼀端放在新创建的容器中,并命 名为eth0(容器的⽹卡),另⼀端放在主机中,以vethxxx这样类似的名字命名,并将这个⽹络设 备加⼊到docker0⽹桥中。可以通过brctl show命令查看。
bridge模式是docker的默认⽹络模式,不写--net参数,就是bridge模式。使⽤docker run -p 时,docker实际是在iptables做了DNAT规则,实现端⼝转发功能。可以使⽤iptables -t nat -vnL 查看。
**创建⼀个bridge⽹络的容器**
[root@docker ~]# docker run -it busybox Unable to find image ‘busybox:latest’ locally latest: Pulling from library/busybox 5cc84ad355aa: Pull complete Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678 Status: Downloaded newer image for busybox:latest / #
**如果出现问题报错**
WARNING: IPv4 forwarding is disabled. Networking will not work.
- 问题原因<br />是没有开启转发,docker网桥配置完后,需要开启转发,不然容器启动后,就会没有网络,配置/etc/sysctl.conf,添加net.ipv4.ip_forward=1
- 问题解决:<br />修改文件
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #添加此行配置
也可修改此文件:/usr/lib/sysctl.d/00-system.conf
重启network和docker服务
systemctl restart network && systemctl restart docker
查看是否修改成功
sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示修改成功
再次执行查看,使用docker不再报错
<a name="89553514"></a>
## host模式
如果启动容器的时候使⽤host模式,那么这个容器将不会获得⼀个独⽴的Network Namespace,⽽是和宿主机共⽤⼀个Network Namespace。容器将不会虚拟出⾃⼰的⽹卡,配置 ⾃⼰的IP等,⽽是使⽤宿主机的IP和端⼝。但是,容器的其他⽅⾯,如⽂件系统、进程列表等还是 和宿主机隔离的。
使⽤host模式的容器可以直接使⽤宿主机的IP地址与外界通信,容器内部的服务端⼝也可以使 ⽤宿主机的端⼝,不需要进⾏NAT,host最⼤的优势就是⽹络性能⽐较好,但是docker host上已经使⽤的端⼝就不能再⽤了,⽹络的隔离性不好。 创建⼀个host⽹络的容器
[root@docker ~]# docker run -it —network host busybox
/ # ifconfig
br-1362f3863208 Link encap:Ethernet HWaddr 02:42:C9:2B:0D:49
inet addr:172.19.0.1 Bcast:172.19.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:c9ff:fe2b:d49/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:438 (438.0 B)
br-d5b01d78427c Link encap:Ethernet HWaddr 02:42:A5:43:A6:02
inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
docker0 Link encap:Ethernet HWaddr 02:42:82:72:DA:52
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:82ff:fe72:da52/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:46 errors:0 dropped:0 overruns:0 frame:0
TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4140 (4.0 KiB) TX bytes:4989 (4.8 KiB)
eth0 Link encap:Ethernet HWaddr 00:0C:29:74:DC:0D
inet addr:192.168.200.11 Bcast:192.168.200.255 Mask:255.255.255.0
inet6 addr: fe80::4e6f:f9e8:b32:518c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:340658 errors:0 dropped:0 overruns:0 frame:0
TX packets:128366 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:353243567 (336.8 MiB) TX bytes:225649848 (215.1 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:90 errors:0 dropped:0 overruns:0 frame:0
TX packets:90 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7459 (7.2 KiB) TX bytes:7459 (7.2 KiB)
veth500604c Link encap:Ethernet HWaddr 4E:AC:27:0E:9D:F0
inet6 addr: fe80::4cac:27ff:fe0e:9df0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:648 (648.0 B)
veth694d133 Link encap:Ethernet HWaddr 4E:D8:94:2C:B2:5C
inet6 addr: fe80::4cd8:94ff:fe2c:b25c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:648 (648.0 B)
veth96651b8 Link encap:Ethernet HWaddr A6:E8:D8:6A:9A:51
inet6 addr: fe80::a4e8:d8ff:fe6a:9a51/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1868 (1.8 KiB) TX bytes:2431 (2.3 KiB)
vethb09c007 Link encap:Ethernet HWaddr 9A:F4:67:10:EE:68
inet6 addr: fe80::98f4:67ff:fe10:ee68/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:648 (648.0 B)
/ #
![image-20220506212153434.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844480506-c78c43c4-3801-44b2-aab2-6fb3c4c1df0a.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ube701f1e&margin=%5Bobject%20Object%5D&name=image-20220506212153434.png&originHeight=781&originWidth=870&originalType=binary&ratio=1&rotation=0&showTitle=false&size=72560&status=done&style=none&taskId=u21aee370-f152-4067-87bc-12e8f50cdf0&title=)<br />通过以上实验得知,该容器的⽹络与宿主机⼀样,直接使⽤Docker host的⽹络,最⼤的好处 就是性能,如果容器对⽹络传输效率有较⾼要求,则可以选择host⽹络。当然不变之处就是牺牲 ⼀些灵活性,⽐如要考虑端⼝冲突⻛问题,Docker host上已经使⽤的端⼝就不能再⽤了。
<a name="8976e087"></a>
## none模式
使⽤none模式,Docker容器拥有⾃⼰的Network Namespace,但是,并不为Docker容器进 ⾏任何⽹络配置。也就是说,这个Docker容器没有⽹卡、IP、路由等信息。需要我们⾃⼰为 Docker容器添加⽹卡、配置IP等。
这种⽹络模式下容器只有lo回环⽹络,没有其他⽹卡。none模式可以在容器创建时通过-- network=none来指定。这种类型的⽹络没有办法联⽹,封闭的⽹络能很好的保证容器的安全性。 创建⼀个none⽹络的容器
[root@docker ~]# docker run -it —network none busybox
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
⽐如某个容器的唯⼀⽤途是⽣产随机密码,就可以放到none⽹络中避免密码被窃取。<br />![image-20220506212401808.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844518645-97a71a60-366e-4ecb-bca2-9b3399b5e433.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uf19a8f02&margin=%5Bobject%20Object%5D&name=image-20220506212401808.png&originHeight=188&originWidth=516&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10915&status=done&style=none&taskId=u17c0c9f6-660b-4868-b156-8e4aa408a7a&title=)
<a name="d8519ce4"></a>
## 自定义网络模式
创建me_net⽹络,系统默认IP地址段⾃动向后递增
[root@docker ~]# docker network create —driver bridge me_net 04bcfda0226c8ce6c91d66ca8966986b92ffda64f1e147eb926af559beca1715
[root@docker ~]# ifconfig
br-04bcfda0226c: flags=4099
br-1362f3863208: flags=4099
br-d5b01d78427c: flags=4099
docker0: flags=4163
eth0: flags=4163
lo: flags=73
veth500604c: flags=4163
veth694d133: flags=4163
veth96651b8: flags=4163
vethb09c007: flags=4163
![image-20220506212559893.png](https://cdn.nlark.com/yuque/0/2022/png/22784349/1651844567133-55523f20-03c3-4e50-978a-56e4c800b9ce.png#clientId=u0ea8564a-059e-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u8078e4c2&margin=%5Bobject%20Object%5D&name=image-20220506212559893.png&originHeight=783&originWidth=892&originalType=binary&ratio=1&rotation=0&showTitle=false&size=78104&status=done&style=none&taskId=u652f2c7f-2e9b-47b2-8057-f0e3fe5ea0d&title=)
<a name="0958fd35"></a>
## 使用自定义网络创建容器
[root@docker ~]# docker run —network me_net -it busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:14:00:02
inet addr:172.20.0.2 Bcast:172.20.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:946 (946.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ```