从零梳理 Docker 核心知识,一文全掌握
从零梳理 Docker 核心知识,一文全掌握
前言
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。

这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。

后来, dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker。

Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。
2013年3月, dotCloud公司的创始人之一 , Docker之父, 28岁的Solomon Hykes正式决定,将Docker项目开源。

不开则已, 一开惊人。
越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。
Docker的人气迅速攀升,速度之快,令人瞠目结舌。
开源当月, Docker 0.1 版本发布。此后的每一个月, Docker都会发布一个版本。到2014年6月9日, Docker 1.0 版本正式发布。
此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、 Amazon、 VMware这样的巨头,都对它青睐有加,表示将全力支持。
Docker火了之后, dotCloud公司干脆把公司名字也改成了Docker Inc. 。
Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻”。
在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是VMWare和OpenStack。
相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑” 出来。
在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑” ,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多“子电脑” ,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个
Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
特性 | 虚拟机 | 容器 |
隔离级别 | 操作系统级 | 进程级 |
隔离策略 | Hypervisor | CGroups |
系统资源 | 5~15% | 0~5% |
特性 | 虚拟机 | 容器 |
启动时间 | 分钟级 | 秒级 |
镜像存储 | GB-TB | KB-MB |
集群规模 | 上百 | 上万 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。
我们具体来看看Docker。
大家需要注意, Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
想要搞懂Docker,其实看它的两句口号就行。
第一句,是“Build, Ship and Run”。也就是, “搭建、发送、运行”,三板斧。
举个例子:
我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸, 一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。
这种魔法,可以把我盖好的房子复制一份,做成“镜像” ,放在我的背包里。
等我到了另一片空地,就用这个“镜像” ,复制一套房子,摆在那边,拎包入住。
所以, Docker的第二句口号就是: “Build once , Run anywhere**(搭建一次,到处能用) ”。
Docker技术的三大核心概念,分别是: 镜像(Image)*容器(Container)*仓库(Repository)*
刚才例子里面,那个放在包里的“镜像” ,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。
说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数
据,其内容在构建之后也不会被改变。
也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。
每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!
也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。
这么一来,我们可以交换镜像,你用我的,我用你的
于是乎,就变成了一个大的公共仓库。
负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。
不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?
所以, Docker Registry服务对镜像的管理是非常严格的。
最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
1、什么是容器
1、 1 什么是容器
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会退出。隔离的环境拥有自己的系统文件, ip地址,主机名等kvm虚拟机, linux,系统文件。
百度百科解释(引用于百度百科图片):


容器是一种基础工具;泛指可以容纳其他物品的工具。可以部分或者完全封闭,被用于容纳、存储、运输物品;物体可以被放置在容器中,容器可以保护内容物。人类使用容器的历史,至少有数十万乃至百万年。例如:瓶、罐、箱、篮、桶、杯。。。
1.2 主机虚拟化与容器的区别

LXC到Docker的历史
LXC,(linuxcontainer)将原来需要手工编码实现的容器技术,进行了封装。实现了,更加方便、快速的容器创建及管理的技术。通过固有“模板” ,安装并启动容器。将远程的程序包下载到本地,安装并创建好我们需要的容器。确实, LXC已经很大程度上降低了容器管理的难度,但是依然使用一些弊端。有些时候可能需要自定制模板,以及使用LXC中自带的模板,以及大规模创建及复制依然比较麻烦。所
以,很难大规模的应用。所以,出现了Docker技术。 Docker是在LXC基础上,使用GoLang二次开发的封装版。
容器相当于你运行了一个接近于裸机的虚拟机。这项技术始于2008年, LXC的大部分功能来自于Solaris容器(又叫做Solaries Zones)以及之前的FreeBSD jails技术。 LXC并不是创建一个成熟的虚拟机,而是创建了一个拥有自己进程程和网络空间的虚拟环境,使用命名空间来强制进程隔离并利用内核的控制组(cgroups)功能,该功能可以限制,计算和隔离一个或多个进程的CPU,内存,磁盘I / O和网络使用情况。 您可以将这种用户空间框架想像成是 chroot 的高级形式。
chroot 是一个改变当前运行进程以及其子进程的根目录的操作。 一个运行在这种环境的程序无法访问根目录外的文件和命令。
注意: LXC使用命名空间来强制进程隔离,同时利用内核的控制组来计算以及限制一个或多个进程的CPU,内存,磁盘I / O和网络使用。
但容器是将软件应用程序与操作系统分离,为用户提供干净且最小的Linux环境,与此同时在一个或多个隔离的“容器” 中运行其他所有内容。容器的目的是启动一组有限数量的应用程序或服务(通常称为微服务),并使它们在独立的沙盒环境中运行。

2、docker容器的安装
2.1 安装前准备
centos7.8 2台
主机名: docker01
IP: 192.168.26.201
主机名: docker02
IP: 192.168.26.202
注:此处关闭了防火墙和selinux,两台机器均可联网,两块网卡,分别对内和对外。
主机名配置、 hosts配置
1 [root@docker01 ~]# cat /etc/hosts 2 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 3 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 4 192.168.26.201 docker01 5 192.168.26.202 docker02 |
配置yum源:
1 [root@docker01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2 [root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo 3 [root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo |
2.2 安装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 | [root@docker01 ~]# yum install docker-ce -y [root@docker01 ~]# systemctl start docker [root@docker01 ~]# systemctl enable docker [root@docker01 ~]# docker version Client: Docker Engine - Community Version: 20.10.7 API version: 1.41 Go version: go1.13.15 Git commit: f0df350 Built: Wed Jun 2 11:58:10 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.7 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: b0f5bc3 Built: Wed Jun 2 11:56:35 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.6 GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d runc: Version: 1.0.0-rc95 GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 docker-init: Version: 0.19.0 GitCommit: de40ad0 |
docker主要组件有:镜像、容器、仓库, 网络,存储启动容器必须需要一个镜像,仓库中只存储镜像 容器---镜像---仓库
2.3 配置docker加速
1 [root@docker01 ~]# vim /etc/docker/daemon.json 2 { 3 "registry-mirrors": ["https://registry.docker-cn.com"] 4 } 5 [root@docker01 ~]# systemctl restart docker |
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行部署服务,环境问题一次构建,处处运行docker是一种软件的打包技术。
docker初次体验:
安装Nginx步骤:
官网下载Nginx源码包创建Nginx
用户编译安装./config....修改配置文件,启动
1 [root@docker01 ~]# docker run -d -p 80:80 nginx |
run (创建并启动一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
1 [root@docker01 ~]# docker load -i docker_nginx1.21.tar.gz 2 [root@docker01 ~]# docker run -d -p 80:80 nginx 3 a212a7fce91e2bd5c5f446e87e4a59b7119907fb169b7b6f6cbf6877a2d9c0ab 4 [root@docker01 ~]# ps -ef | grep nginx 5 root 12998 12976 0 15:20 ? 00:00:00 nginx: master process nginx -g daemon off; 6 101 13052 12998 0 15:20 ? 00:00:00 nginx: worker process 7 101 13053 12998 0 15:20 ? 00:00:00 nginx: worker process 8 root 13055 11546 0 15:20 pts/0 00:00:00 grep --color=auto nginx 9 |
image-20210629152138875
4、docker镜像管理
搜索镜像 docker search选镜像的建议:
1,优先考虑官方
2 ,stars数量多
官方镜像仓库地址: hub.docker.com获取镜像 docker pull(push)
镜像加速器:阿里云加速器, daocloud加速器,中科大加速器, Docker 中国官方镜像加速: https://registry.docker-cn.com
官方pull docker pull centos:6.8 (没有指定版本,默认会下载最新版)私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest查看镜像列表 docker images or docker image ls
删除镜像 docker rmi
例子: docker image rm centos:latest导出镜像 docker save
例子: docker image save centos -o docker-centos7.4.tar.gz导入镜像 docker load
例子: docker image load -i docker-centos7.4.tar.gz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@docker01 ~]# docker pull busybox [root@docker01 ~]# docker pull busybox:1.29 1.29: Pulling from library/busybox b4a6e23922dd: Pull complete Digest: sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796 Status: Downloaded newer image for busybox:1.29 docker.io/library/busybox:1.29 [root@docker01 ~]# docker image save -o docker_busybox1.29.tar.gz busybox:1.29 [root@docker01 ~]# ls anaconda-ks.cfg docker_busybox1.29.tar.gz docker_nginx1.21.tar.gz [root@docker01 ~]# docker load -i docker_busybox1.29.tar.gz 23bc2b70b201: Loading layer 1.37MB/1.37MB Loaded image: busybox:1.29 [root@docker01 ~]# docker images | ||||||
REPOSITORY nginx busybox busybox | TAG latest latest 1.29 | IMAGE ID 4f380adfc10f 69593048aa3a 758ec7f3a1ee | CREATED 6 days ago 3 weeks ago 2 years ago | SIZE 133MB 1.24MB 1.15MB | |||
[root@docker01 ~]# docker [root@docker01 ~]# docker [root@docker01 ~]# docker | load -i load -i load -i | docker_alpine.tar.gz docker_centos6.9.tar.gz docker_k8s_dns.tar.gz | |||||
5、docker容器管理
docker run -d -p 80:80 nginx:latest run (创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令运行容器
docker run image_name
docker run ==== docker create + docker start启动容器
docker start停止容器
docker stop CONTAINER_ID杀死容器
docker kill container_name查看容器列表
docker ps(-a -l -q)
进入正在运行的容器(目的,调试,排错)
docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一个终端) 偷偷离开的快捷键ctrl+p,ctrl+q docker attach [OPTIONS] CONTAINER
nsenter(安装yum install -y util-linux 弃用)删除容器
docker rm批量删除容器
1 docker rm -f `docker ps -a -q` |
-q:静默输出
总结: 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
[root@docker01 ~]# docker run -it --name centos6 centos:6.9 /bin/bash [root@10f81d643f3f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:50 pts/0 00:00:00 /bin/bash
root 14 1 0 07:50 pts/0 00:00:00 ps -ef
[root@10f81d643f3f /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
a212a7fce91e nginx "/docker-entrypoint.… " 31 minutes ago Up 31
minutes 0.0.0.0:80->80/tcp, :::80->80/tcp gracious_zhukovsky [root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
10f81d643f3f centos:6.9 "/bin/bash" About a minute ago
Exited (0) About a minute ago centos6
a212a7fce91e nginx "/docker-entrypoint.… " 31 minutes ago Up
31 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp gracious_zhukovsky
[root@docker01 ~]# docker start centos6 或docker container start centos6 centos6
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
10f81d643f3f centos:6.9 "/bin/bash" 2 minutes ago Up 9
seconds centos6
a212a7fce91e nginx "/docker-entrypoint.… " 32 minutes ago Up 32
minutes 0.0.0.0:80->80/tcp, :::80->80/tcp gracious_zhukovsky [root@docker01 ~]# docker stop 10f81d643f3f
10f81d643f3f
[root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
25 10f81d643f3f centos:6.9 "/bin/bash" 3 minutes ago Exited (137) 5 seconds ago centos6
26 [root@docker01 ~]# docker rm 10f81d643f3f
27 10f81d643f3f
28 [root@docker01 ~]# docker rm -f `docker ps -a -q`
29 a212a7fce91e
创建容器,初始命令, /bin/bash
1 [root@docker01 ~]# docker run -it centos:6.9 /bin/bash 2 [root@3ddb8f03e85f /]# |
1 [root@docker01 ~]# docker attach 3ddb8f03e85f 2 [root@3ddb8f03e85f /]# |
进入容器 ,这样进来后,操作都是同步的
建议使用以下命令进入容器:还可以给另外一个发送消息
1 2 3 4 5 6 7 8 9 10 | [root@docker01 ~]# docker run -it centos:6.9 /bin/bash [root@fc5c09861a54 /]# [root@docker01 ~]# docker exec -it fc5c09861a54 /bin/bash [root@fc5c09861a54 /]# [root@fc5c09861a54 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 07:58 pts/0 00:00:00 /bin/bash root 14 0 0 07:58 pts/1 00:00:00 /bin/bash root 28 14 0 07:59 pts/1 00:00:00 ps -ef [root@fc5c09861a54 /]# echo 'hello' > /dev/pts/0 |
业务在容器中运行:需要初始命令,夯住,启动服务,例如。tail -f /etc/hosts这样创建出来的容器,秒死
[root@docker01 ~]# docker rm -f `docker ps -a -q` fc5c09861a54
3ddb8f03e85f
[root@docker01 ~]# docker run -d centos:6.9 echo hello
0d8b1c9a7803dcf03ee9f99c0722d135422e115f72affe85a10751fc1a784e2e [root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
0d8b1c9a7803 centos:6.9 "echo hello" 5 seconds ago Exited (0) 4 seconds ago trusting_jemison
[root@docker01 ~]# docker run -d centos:6.9 sleep 10
0bb1428b329a682a6c66e103e467bf1adf3afce657307b0ea026d50ae6059b9c [root@docker01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
0bb1428b329a centos:6.9 "sleep 10" 5 seconds ago Up 4 seconds pensive_lehmann
[root@docker01 ~]# docker run -d centos:6.9 tail -f /etc/hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15 493403a6f7c8ef00c51ce6eb9b16802dc56ea5dd0cb24993bffab97acb714029
16 [root@docker01 ~]# docker ps -a
17 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18 493403a6f7c8 centos:6.9 "tail -f /etc/hosts" 3 seconds ago Up 2 seconds ecstatic_tu
19 0bb1428b329a centos:6.9 "sleep 10" 31 seconds ago Exited
(0) 20 seconds ago pensive_lehmann
20 0d8b1c9a7803 centos:6.9 "echo hello" 56 seconds ago Exited
(0) 56 seconds ago trusting_jemison
21
如何让容器一直存活?分配一个交互式终端
1 [root@docker01 ~]# docker run -d -it centos:6.9 2 91d5a19a1ccf663311d789a97e87a7cc299c107cd58c7c5161c82a99baa71abd 3 [root@docker01 ~]# docker ps -a -l 4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5 91d5a19a1ccf centos:6.9 "/bin/bash" 3 seconds ago Up 3 seconds hopeful_archimedes |
观察nginx容器为什么会一直运行
1 2 3 4 5 6 7 8 9 | [root@docker01 ~]# docker run -d nginx:latest 403c2520f4fccefa4db58c9ef0e25aa32eea39e4c7d4b25e7aee23ff3a6ed843 [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 403c2520f4fc nginx:latest "/docker-entrypoint.… " 4 seconds ago Up 3 seconds 80/tcp strange_carson [root@docker01 ~]# docker ps -a -l --no-trunc CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 403c2520f4fccefa4db58c9ef0e25aa32eea39e4c7d4b25e7aee23ff3a6ed843 nginx:latest "/docker-entrypoint.sh nginx -g 'daemon off;'" 10 seconds ago Up 9 seconds 80/tcp strange_carson |
测试:
1 [root@nginx ~]# yum -y install nginx
2 [root@nginx ~]# nginx
3 [root@nginx ~]# ps -ef | grep nginx
4 root 2901 1 0 16:10 ? 00:00:00 nginx: master process nginx
5 nginx 2902 2901 0 16:10 ? 00:00:00 nginx: worker process
6 nginx 2903 2901 0 16:10 ? 00:00:00 nginx: worker process
7 root 2905 2818 0 16:10 pts/0 00:00:00 grep --color=auto nginx
8 [root@nginx ~]# nginx -s stop
9 [root@nginx ~]# nginx -g 'daemon off;'
10 [root@nginx ~]# nginx -h
11 nginx version: nginx/1.20.1
12 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
13 [-e filename] [-c filename] [-g directives] 14
15 Options:
16 -?,-h : this help
17 -v : show version and exit
18 -V : show version and configure options then exit
19 -t : test configuration and exit
20 -T : test configuration, dump it and exit
21 -q : suppress non-error messages during configuration testing
22 -s signal : send signal to a master process: stop, quit, reopen, reload
23 -p prefix : set prefix path (default: /usr/share/nginx/)
24 -e filename : set error log file (default: /var/log/nginx/error.log)
25 -c filename : set configuration file (default: /etc/nginx/nginx.conf)
26 -g directives : set global directives out of configuration file
27 [root@nginx ~]# vim /etc/nginx/nginx.conf
28 user nginx;
29 worker_processes auto;
30 error_log /var/log/nginx/error.log;
31 pid /run/nginx.pid;
32 daemon off;
33 [root@nginx ~]# nginx -s stop
34 [root@nginx ~]# nginx
可以把配置文件中的参数拿出来外面运行
1 2 3 4 5 6 7 8 9 | [root@nginx ~]# vi /etc/nginx/nginx.conf #user nginx; [root@nginx ~]# nginx -g 'user root;' [root@nginx ~]# ps -ef | grep nginx root 2988 2818 0 16:14 pts/0 00:00:00 nginx: master process nginx -g user root; root 2989 2988 0 16:14 pts/0 00:00:00 nginx: worker process root 2990 2988 0 16:14 pts/0 00:00:00 nginx: worker process root 3009 2991 0 16:14 pts/1 00:00:00 grep --color=auto nginx |
1 2 3 4 5 6 7 8 9 10 11 | [root@docker01 ~]# docker run -it nginx:latest /bin/bash root@51ae9e66d433:/# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" |
6、docker容器的网络访问(端口映射)
在Docker容器的日常使用中,有以下5种常见的端口映射方式:
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort 物理主机的所有IP地址的端口都映射到docker的端口
-p ip:hostPort:containerPort 指定物理主机的固定IP地址的端口映射到docker的端口
-p ip::containerPort(随机端口)指定物理主机的固定IP地址映射到docker的端口,物理主机端口随机
-p hostPort:containerPort/udp 除了可以做 tcp 的端口映射,当然还可以做 udp 的端口映射
-p 10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
-p 81:80 –p 443:443 可以指定多个-p docker port 容器名查看端口映射的配置
随机映射
docker run -P (随机端口)
通过iptables来实现的端口映射
每个容器运行后,都是有一个IP地址的
6.1 方式一:.P 随机映射

[root@docker01 ~]# docker run -it centos:6.9 [root@25575240f403 /]# ifconfig
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
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 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:266 (266.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)
[root@25575240f403 /]#
[root@docker01 ~]# docker pull ghost:alpine [root@docker01 ~]# docker images
REPOSITORY
IMAGE ID
a57135501a4e
4f380adfc10f
69593048aa3a
b7b28af77ffe
758ec7f3a1ee
adf829198a7f
TAG
SIZE
CREATED
ghost
days ago
nginx
days ago
busybox
weeks ago alpine
months ago busybox
years ago centos
years ago
alpine 369MB
4
6
3
23
2
2
latest 133MB
latest
1.24MB
latest
5.58MB
1.29
1.15MB
6.9 195MB
29 gcr.io/google_containers/kubedns-amd64 1.9 26cf1ed9b144 4 years ago 47MB
30 gcr.io/google_containers/dnsmasq-metrics-amd64 1.0 5271aabced07 4 years ago 14MB
31 gcr.io/google_containers/kube-dnsmasq-amd64 1.4 3ec65756a89b 4 years ago 5.13MB
32 gcr.io/google_containers/exechealthz-amd64 1.2 93a43bfb39bf 4 years ago 8.37MB
运行查看,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@docker01 ~]# docker run -d -P ghost:alpine c66cfbf6113189cdde45bd1b41bd4f1ab63c6e8890e84eb8012bd47a3315befd [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c66cfbf61131 ghost:alpine "docker-entrypoint.s… " 4 seconds ago Up 3 seconds 0.0.0.0:49153->2368/tcp, :::49153->2368/tcp happy_beaver [root@docker01 ~]# netstat -ntulp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1049/master tcp 0 0 0.0.0.0:49153 0.0.0.0:* LISTEN 16034/docker-proxy tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 963/sshd tcp6 0 0 ::1:25 :::* LISTEN 1049/master tcp6 0 0 :::49153 :::* LISTEN 16039/docker-proxy tcp6 0 0 :::22 :::* LISTEN 963/sshd |

查看防火墙规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@docker01 ~]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:2368 Chain DOCKER (2 references) target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:2368 |
6.2 方式二:物理主机的所有IP地址的端口都映射到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
[root@docker01 ~]# docker run -d -p 80:80 nginx:latest
525b35bfb37cfe168098860f8ce257ca0f46c3303717f5ae7a655704c028e4c1 [root@docker01 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match
dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match
dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:2368
MASQUERADE tcp -- 172.17.0.3 172.17.0.3 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153
to:172.17.0.2:2368

25 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.3:80
26 [root@docker01 ~]# docker run -d -p 81:80 nginx:latest
多个容器都想使用8080端口,需要有多个IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@docker01 ~]# ifconfig ens32 ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.26.201 netmask 255.255.255.0 broadcast 192.168.26.255 inet6 fe80::a5:298c:1b7:5c8 prefixlen 64 scopeid 0x20<link> inet6 fe80::e0ca:dfd3:5da4:cdcb prefixlen 64 scopeid 0x20<link> inet6 fe80::6122:f2f2:5138:bc71 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:03:e3:5a txqueuelen 1000 (Ethernet) RX packets 545527 bytes 731501088 (697.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 229476 bytes 266431349 (254.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@docker01 ~]# ifconfig ens32:1 192.168.26.222/24 up [root@docker01 ~]# ifconfig ens32:1 ens32:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.26.222 netmask 255.255.255.0 broadcast 192.168.26.255 ether 00:0c:29:03:e3:5a txqueuelen 1000 (Ethernet) [root@docker01 ~]# docker rm -f `docker ps -a -q` [root@docker01 ~]# docker run -d -p 192.168.26.201:80:80 nginx:latest [root@docker01 ~]# docker run -d -p 192.168.26.222:80:2368 ghost:alpine |
6.3 随机端口
1 2 3 4 5 6 7 8 9 10 11 | [root@docker01 ~]# docker run -d -p 192.168.26.201::2368 ghost:alpine e7e86dcf5c58c95d9b88efc1fdf457dbcdce61e498f23a30f0d20e1d8a9b14e5 [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e7e86dcf5c58 ghost:alpine "docker-entrypoint.s… " 5 seconds ago Up 4 seconds 192.168.26.201:49153->2368/tcp relaxed_mclean [root@docker01 ~]# docker run -d -p 192.168.26.201::2368 ghost:alpine 861e378c7c8a0008b8b152b779ccfcbbad69df128e657faebd0c8d93fe03ed5f [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 861e378c7c8a ghost:alpine "docker-entrypoint.s… " 2 seconds ago Up 1 second 192.168.26.201:49154->2368/tcp angry_feynman |
7、docker的数据卷管理
持久化
数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会把容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录) :dst(容器的目录)数据卷容器
--volumes-from(跟某一个已经存在的容器挂载相同的卷)
7.1 小鸟飞飞案例
运行nginx容器,修改首页内容
1 [root@docker01 ~]# docker run -d -p 80:80 nginx:latest 2 5944383ba681b26bebada5ad8756ddf55d0928983e47205b1564986294f09840 3 [root@docker01 ~]# docker ps -a -l 4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5 5944383ba681 nginx:latest "/docker-entrypoint.… " About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp inspiring_bhabha 6 [root@docker01 ~]# docker exec -it inspiring_bhabha /bin/bash 7 root@5944383ba681:/# cd /usr/share/nginx/html/ 8 root@5944383ba681:/usr/share/nginx/html# ls 9 50x.html index.html 10 root@5944383ba681:/usr/share/nginx/html# echo "test" > index.html 11 root@5944383ba681:/usr/share/nginx/html# exit 12 exit |
上传小鸟飞飞源码
1 2 3 4 5 6 7 8 9 10 | [root@docker01 ~]# cd /opt/ [root@docker01 opt]# ls containerd [root@docker01 opt]# mkdir xiaoniao [root@docker01 opt]# cd xiaoniao/ [root@docker01 xiaoniao]# rz -E rz waiting to receive. [root@docker01 xiaoniao]# ls [root@docker01 xiaoniao]# yum -y install unzip |
解压并传到容器中
1 [root@docker01 xiaoniao]# unzip xiaoniaofeifei.zip 2 [root@docker01 xiaoniao]# cd 3 [root@docker01 opt]# docker cp xiaoniao/ inspiring_bhabha:/usr/share/nginx/html 4 [root@docker01 opt]# docker exec -it inspiring_bhabha /bin/bash 5 root@5944383ba681:/# cd /usr/share/nginx/html/ 6 root@5944383ba681:/usr/share/nginx/html# ls 7 50x.html index.html xiaoniao |
访问测试
换一种方式
1 [root@docker01 opt]# docker rm -f `docker ps -a -q` 2 [root@docker01 opt]# docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest 3 8d07900d5add692a2dd5ff413e0c66fbcec22761ad3674a8c363de28f33619a8 |
访问:
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 | [root@docker01 ~]# docker run -d -p 80:80 -v xiaoniao:/usr/share/nginx/html nginx:latest deb1ad8934422cad3cea168d0a79941e058423e5ec4a8b5ae64d9645e10a6d16 [root@docker01 ~]# docker volume ls | |
DRIVER local local local local local | VOLUME NAME 6d3bc28957630af888e65621b0af3f62f894ea97a2dcd11d1fc9b682c2f72ac9 31d867df65d4db1d90047741be97eebd8334473aeda821a629d925c0799683d9 576a52734f898bb538eb729185ae83d0a036a0903b003efbd87281ea82bf3244 2391165fff2202085d5cc1579142e27051c0c7d35e38fa9c9aba928f0dcd1a52 xiaoniao | |
[root@docker01 ~]# docker volume inspect xiaoniao [ { "CreatedAt": "2021-06-29T20:37:15+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/xiaoniao/_data", "Name": "xiaoniao", "Options": null, "Scope": "local" } ] [root@docker01 ~]# cd /var/lib/docker/volumes/xiaoniao/_data/ [root@docker01 _data]# ls 50x.html index.html [root@docker01 _data]# echo "ssss" > index.html | ||
访问:
7.2 练习
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
-p 80:80 -p 81:81 -v xxx :xxx -v xxx:xxxx基于nginx多端口的多站点。
方法一:
1 [root@docker01 ~]# docker rm -f `docker ps -a -q` 2 [root@docker01 opt]# vim xiaoniao.conf 3 server { 4 listen 81; 5 server_name _; 6 root /opt; 7 index index.html index.htm; 8 } 9 |
方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@docker01 opt]# docker rm -f `docker ps -a -q` 7d71cd10ac0a [root@docker01 opt]# docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt nginx:latest 91a17094ee2fef25fc0405627b22c61919df8df2b1d9a57f64b8634ec5bec457 [root@docker01 opt]# docker exec -it youthful_carson /bin/bash root@91a17094ee2f:/# cd /etc/nginx/conf.d/ root@91a17094ee2f:/etc/nginx/conf.d# echo 'server { > > listen 81; > > server_name _; > > root /opt; > > index index.html index.htm; > > }' > xiaoniao.conf root@91a17094ee2f:/etc/nginx/conf.d# ls default.conf xiaoniao.conf root@91a17094ee2f:/etc/nginx/conf.d# exit exit [root@docker01 opt]# docker restart youthful_carson youthful_carson |
8、手动将容器保存为镜像
docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选]
1):基于容器制作镜像 docker run -it centos:6.9 ######
yum install httpd
yum install openssh-server /etc/init.d/sshd start
#!/bin/bash
/etc/init.d/httpd start /usr/sbin/sshd -D
chmod +x /init.sh
2)将容器提交为镜像
docker commit zz centos6-ssh-httpd:v1 3)测试镜像功能是否可用
手动制作的镜像,传输时间长 镜像初始命令
8.1 制作一个kodexplorer网盘docker镜像。
nginx + php-fpm(httpd + php)部署nginx
1 [root@docker01 ~]# docker rm -f `docker ps -a -q` 2 [root@docker01 ~]# docker load -i docker_centos7.tar.gz 3 [root@docker01 ~]# docker run -it -p 80:80 centos:7 /bin/bash 4 [root@7ca6d8a21482 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 5 [root@7ca6d8a21482 /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 6 [root@7ca6d8a21482 /]# yum -y install nginx 7 [root@7ca6d8a21482 /]# nginx -g 'daemon off;' |
1 [root@docker01 ~]# docker exec -it xenodochial_nobel /bin/bash 2 [root@7ca6d8a21482 /]# cd /usr/share/nginx/html/ 3 [root@7ca6d8a21482 html]# ls 4 404.html 50x.html en-US icons img index.html nginx-logo.png poweredby.png 5 [root@a4e189a9650a html]# rm -rf index.html 6 [root@a4e189a9650a html]# ls 7 404.html 50x.html en-US icons img nginx-logo.png poweredby.png 8 [root@a4e189a9650a html]# echo "111" > index.html |
image-20210629213026479提交镜像
[root@docker01 ~]# docker commit affectionate_goldberg centos7_nginx:v1 sha256:c1cf8cbd66d18617b91ceea2ab2e0ddf2af0973efedbaf347e1100d4a0dbe887
3
REPOSITORY
CREATED
centos7_nginx seconds ago
ghost
days ago nginx
days ago busybox
weeks ago alpine
months ago centos
years ago busybox
years ago centos
years ago
IMAGE ID
c1cf8cbd66d1
a57135501a4e
4f380adfc10f
69593048aa3a
b7b28af77ffe
9f38484d220f
758ec7f3a1ee
adf829198a7f
v1
alpine
latest
latest
latest
7
1.29
6.9
5.58MB
202MB
1.15MB
195MB
396MB
369MB
133MB
1.24MB
4
5
6
7
8
9
10
11
12
3
4
6
3
23
2
2
2
[root@docker01 ~]# docker images

SIZE
1
2
TAG
13 gcr.io/google_containers/kubedns-amd64 1.9 26cf1ed9b144 4 years ago 47MB
14 gcr.io/google_containers/dnsmasq-metrics-amd64 1.0 5271aabced07 4 years ago 14MB
15 gcr.io/google_containers/kube-dnsmasq-amd64 1.4 3ec65756a89b 4 years ago 5.13MB
16 gcr.io/google_containers/exechealthz-amd64 1.2 93a43bfb39bf 4 years ago 8.37MB
测试:
1 2 3 4 5 6 7 8 9 10 | [root@docker01 ~]# docker run -d -p 81:80 centos7_nginx:v1 eda5a7119075d0ea9d1150bd3232961d8e6cfce046e7c0dfdc22ab6f3fa9a8c8 [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eda5a7119075 centos7_nginx:v1 "/bin/bash" 11 seconds ago Exited (0) 9 seconds ago optimistic_joliot [root@docker01 ~]# docker run -d -p 81:80 centos7_nginx:v1 nginx -g 'daemon off;' 4d6d988b2858304207154a4b76ee3696f1f96fad67c8ab309133ca3302450f7f [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d6d988b2858 centos7_nginx:v1 "nginx -g 'daemon of… " 3 seconds ago Up 2 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp distracted_shtern |
制作镜像,部署php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@docker01 ~]# docker rm -f `docker ps -a -q` 4d6d988b2858
eda5a7119075 a4e189a9650a
[root@docker01 ~]# docker run -it -p 80:80 centos7_nginx:v1 /bin/bash
[root@e146e20acc64 /]# rpm -q nginx nginx-1.20.1-2.el7.x86_64
[root@e146e20acc64 /]# yum -y install php-fpm
[root@e146e20acc64 /]# vi /etc/php-fpm.d/www.conf user = nginx
group = nginx
[root@e146e20acc64 /]# php-fpm -D
[root@e146e20acc64 /]# grep -Ev '^$|#' /etc/nginx/nginx.conf.default > /etc/nginx/nginx.conf
[root@e146e20acc64 /]# vi /etc/nginx/nginx.conf worker_processes 1;
events {
worker_connections 1024; }
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
25 listen 80;
26 server_name localhost;
27 location / {
28 root /code;
29 index index.php index.html index.htm; 30 }
31 location ~ \.php$ {
32 root /code;
33 fastcgi_pass 127.0.0.1:9000;
34 fastcgi_index index.php;
35 fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
36 include fastcgi_params; 37 }
38 } 39 }
40 [root@e146e20acc64 /]# nginx -t
41 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
42 nginx: configuration file /etc/nginx/nginx.conf test is successful
43 [root@e146e20acc64 /]# mkdir /code
44 [root@e146e20acc64 /]# cd /code/
复制源码至容器
1 [root@docker01 ~]# docker cp kodexplorer4.40.zip magical_germain:/code |
解压:
1 [root@e146e20acc64 code]# yum -y install unzip 2 [root@e146e20acc64 code]# unzip kodexplorer4.40.zip 3 [root@e146e20acc64 code]# chmod -R 777 /code/ 4 [root@e146e20acc64 code]# nginx |
1 [root@e146e20acc64 code]# yum -y install php-gd php-mbstring 2 [root@e146e20acc64 code]# netstat -ntulp 3 Active Internet connections (only servers) 4 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 5 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 115/nginx: master p 6 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 95/php-fpm: master 7 [root@e146e20acc64 code]# kill 95 8 [root@e146e20acc64 code]# php-fpm -D |

1 [root@e146e20acc64 code]# exit 2 [root@docker01 ~]# docker commit magical_germain kod:v1 3 sha256:64bebf19e8894b1e0e922cfaaa5edf80d2094cfeb8d455f81cf68e20ca610e56 4 [root@docker01 ~]# docker images | head -5 5 REPOSITORY TAG IMAGE ID CREATED SIZE 6 kod v1 64bebf19e889 6 seconds ago 650MB 7 centos7_nginx v1 c1cf8cbd66d1 19 minutes ago 396MB 8 ghost alpine a57135501a4e 4 days ago 369MB 9 nginx latest 4f380adfc10f 6 days ago 133MB |
因为此镜像中有两个服务,如果是命令行,无法一起启动多个服务,需要写脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@docker01 ~]# docker start magical_germain magical_germain [root@docker01 ~]# docker attach magical_germain [root@e146e20acc64 /]# vi /init.sh nginx -g 'daemon off;' [root@e146e20acc64 /]# sh /init.sh ^C[root@e146e20acc64 /]# exit [root@docker01 ~]# docker commit e146e20acc64 kod:v2 sha256:f642ff90a2aa16d9ed0970c81227c18dc057db7ea891d86e3bad1a94e6e6fac7 [root@docker01 ~]# docker run -d -p 81:80 kod:v2 /bin/bash /init.sh f871364de66b318d692fc752f12fb1e7b9d655ffc8faae41f9cede715500895b |
访问:
构建另一个容器,安装数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@docker01 ~]# docker rm -f `docker ps -a -q` f871364de66b e146e20acc64 [root@docker01 ~]# docker run -it -p 80:80 kod:v2 /bin/bash [root@aff4c14e2f61 /]# nginx [root@aff4c14e2f61 /]# php-fpm -D [root@aff4c14e2f61 /]# yum -y install mariadb-server [root@aff4c14e2f61 /]# mysql_install_db --user=mysql --defaults- file=/etc/my.cnf [root@aff4c14e2f61 /]# mysqld_safe --defaults-file=/etc/my.cnf & [root@aff4c14e2f61 /]# netstat -ntulp | grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN - [root@docker01 ~]# docker cp phpwind_UTF8_8.7.1.zip silly_morse:/code [root@aff4c14e2f61 code]# ls [root@aff4c14e2f61 code]# unzip phpwind_UTF8_8.7.1.zip [root@aff4c14e2f61 code]# mv upload/* . [root@aff4c14e2f61 code]# chown -R nginx:nginx . |
访问:
创建相关数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@aff4c14e2f61 code]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 1 Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database phpwind; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> quit Bye [root@aff4c14e2f61 code]# mysqladmin -uroot password '123456' |
1 [root@aff4c14e2f61 code]# cat /var/log/nginx/error.log 2 [root@aff4c14e2f61 code]# yum -y install php-mysqli 3 [root@aff4c14e2f61 code]# netstat -nutlp 4 Active Internet connections (only servers) 5 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 6 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 19/php-fpm: master 7 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN - 8 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16/nginx: master pr 9 [root@aff4c14e2f61 code]# kill 19 10 [root@aff4c14e2f61 code]# php-fpm -D |
再次测试
此刻里面有三个服务,我们修改下之前的脚本
1 [root@aff4c14e2f61 code]# vi /init.sh 3 mysql_install_db --user=mysql --defaults-file=/etc/my.cnf 4 mysqld_safe --defaults-file=/etc/my.cnf & 5 php-fpm -D 6 nginx -g 'daemon off; 7 [root@aff4c14e2f61 code]# exit 8 [root@docker01 ~]# docker commit aff4c14e2f61 phpwind:v1 9 sha256:d76d04c530a96bc10a9a73312873f1ee834cd35b154f73dd08a4a42d41440c28 10 [root@docker01 ~]# docker run -d -p 81:80 phpwind:v1 /bin/bash /init.sh 11 cf69253defc9373a70b6d28eda6983a6e394bef8d166b1780cbd5c0879ad57f6 12 [root@docker01 ~]# docker logs cf69253defc93 |
此时,访问出现问题,解决时区问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@docker01 ~]# docker exec -it cf69253defc93 /bin/bash [root@cf69253defc9 /]# times 0m0.019s 0m0.015s 0m0.001s 0m0.011s [root@cf69253defc9 /]# date Tue Jun 29 14:15:53 UTC 2021 [root@cf69253defc9 /]# cat /etc/localtime TZif2UTCTZif2UTC UTC0 [root@cf69253defc9 /]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cp: overwrite '/etc/localtime'? y [root@cf69253defc9 /]# exit exit [root@docker01 ~]# docker restart cf69253defc9 cf69253defc9 [root@docker01 ~]# docker exec -it cf69253defc9 /bin/bash [root@cf69253defc9 /]# date Tue Jun 29 22:16:53 CST 2021 |
9、dockerfile自动构建docker镜像
类似ansible剧本,大小几kb手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
dockerfile主要组成部分:
基础镜像信息 FROM centos:7
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行初始命令 CMD ["/bin/bash"] dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像) 第一条
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有) LABLE 描述,标签
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(会自动解压tar) 制作docker基础的系统镜像WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口) (-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件(不会解压) rootfs.tar.gz ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
[root@docker01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@docker01
[root@docker01
[root@docker01
[root@docker01
[root@docker01
[root@docker01 FROM centos:7
~]# cd /opt/
opt]# mkdir dockerfile
opt]# cd dockerfile/
dockerfile]# mkdir nginx
dockerfile]# cd nginx nginx]# vim Dockerfile
nginx]# cat Dockerfile
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel- 7.repo
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo RUN yum -y install nginx
CMD ["nginx","-g","daemon off;"]
[root@docker01 nginx]# docker build -t centos7_nginx:v2 --network=host /opt/dockerfile/nginx/
[root@docker01 nginx]# docker run -d -p 88:80 centos7_nginx:v2
64158e0ed54a6f6448b156f68a6018e09c4bab42d4b019cd7b909c1cca26e368 root@docker01 nginx]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
64158e0ed54a centos7_nginx:v2 "nginx -g 'daemon of… " 2 minutes ago Up 2 minutes 0.0.0.0:88->80/tcp, :::88->80/tcp sweet_chebyshev
[root@docker01 nginx]# docker exec -it 64158e0ed54a /bin/bash [root@64158e0ed54a /]# cd /usr/share/nginx/html/
[root@64158e0ed54a html]# ls
22 404.html 50x.html en-US icons img index.html nginx-logo.png poweredby.png
23 [root@64158e0ed54a html]# rm -rf index.html
24 [root@64158e0ed54a html]# echo 222 > index.html 25
image-20210630143817030
总结:
使用dockerfile自动构建镜像:
1 :手动制作一次docker镜像(收集命令)
2:编写dockerfile文件
3 :docker bulid 自动构建docker镜像
4:测试docker镜像
docker image prune 删除没有名字没有标签的镜像
9.1 扫雷案例
dockerfile脚本构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@docker01 [root@docker01 nginx [root@docker01 [root@docker01 [root@docker01 FROM centos:7 | nginx]# cd .. dockerfile]# ls dockerfile]# mkdir saolei dockerfile]# cd saolei/ saolei]# vim dockerfile |
RUN curl -o /etc/yum.repos.d/base7.repo https://mirrors.aliyun.com/repo/Centos-7.repo RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel- 7.repo RUN yum -y install tomcat unzip RUN cd /var/lib/tomcat/webapps/ && curl -o saolei.zip http://192.168.26.111/software/saolei.zip && \ unzip saolei.zip && mv saolei ROOT ADD init.sh /init.sh CMD ["/bin/bash","/init.sh"] | ||
创建所需脚本
1 [root@docker01 saolei]# vim init.sh 2 # !/bin/bash 3 /usr/libexec/tomcat/server start |
1 [root@docker01 saolei]# docker build -t centos7_tomcat7:v2 --network=host . 2 [root@docker01 saolei]# docker run -d -p 8080:8080 centos7_tomcat7:v2 3 2d0313b2ed8322d31daa625d2e7d5af1ed48d5e1b019dd5d7658ef04989a9593 4 [root@docker01 saolei]# docker ps -a -l 5 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6 2d0313b2ed83 centos7_tomcat7:v2 "/bin/bash /init.sh" 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp objective_saha |
image-20210630145648497
注:因为在本地搭建了yum源,所以dockfile文件的内容有改动
1 [root@docker01 saolei]# cat dockerfile 2 FROM centos:7 3 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo 4 RUN yum -y install tomcat unzip 5 RUN cd /var/lib/tomcat/webapps/ && \ 6 curl -o saolei.zip http://192.168.26.111/software/saolei.zip && \ 7 unzip saolei.zip && \ 8 mv saolei ROOT 9 10 11 ADD init.sh /init.sh 12 CMD ["/bin/bash","/init.sh"] |
我们在运行容器的时候,默认进入容器的根目录下,也可以使用--workdir来指定路径
1 [root@docker01 saolei]# docker run -it centos:7 2 [root@b30abac5d5b1 /]# pwd 3 / 4 [root@docker01 saolei]# docker run -it --workdir /tmp centos:7 5 [root@e832cabc3c18 tmp]# pwd 6 /tmp |
我们也可以对上面的dockfile文件稍微修改,把cd切换成workdir
1 [root@docker01 saolei]# cat dockerfile 2 FROM centos:7 3 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo 4 RUN yum -y install tomcat unzip 5 WORKDIR /var/lib/tomcat/webapps/ 6 RUN curl -o saolei.zip http://192.168.26.111/software/saolei.zip && \ 7 unzip saolei.zip && \ 8 mv saolei ROOT 9 10 11 ADD init.sh /init.sh 12 CMD ["/bin/bash","/init.sh"] |
1 [root@docker01 saolei]# docker build -t centos7_tomcat7:v3 --network=host . 2 [root@docker01 saolei]# docker run -d -p 8081:8080 centos7_tomcat7:v3 |
image-20210630151400573 EXPOSE
-P 随机端口映射
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 | [root@docker01 saolei]# docker run -d -P nginx:latest 5d75d051803a8335950429da44ba028eff03b9d16c146d84d96c1758b39abb2f [root@docker01 saolei]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5d75d051803a nginx:latest "/docker-entrypoint.… " 4 seconds ago Up 3 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp vigorous_sammet [root@docker01 saolei]# docker run -d -P centos7_tomcat7:v3 eee06a813beea8447cf76781503c2e17facbd7078b4434013c585d43ad91adb0 [root@docker01 saolei]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eee06a813bee centos7_tomcat7:v3 "/bin/bash /init.sh" 3 seconds ago Up 2 seconds exciting_greider [root@shixun1 saolei]# cat dockerfile FROM centos:7 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo RUN yum -y install tomcat unzip WORKDIR /var/lib/tomcat/webapps/ RUN curl -o saolei.zip http://192.168.26.111/software/saolei.zip && \ unzip saolei.zip && \ mv saolei ROOT ADD init.sh /init.sh EXPOSE 8080 CMD ["/bin/bash","/init.sh"] [root@docker01 saolei]# docker run -d -P centos7_tomcat7:v4 9385113316a96d9958139fbed7de6d3ef59645d6e4ac8b5b7e7db2c3bc329e8e [root@docker01 saolei]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9385113316a9 centos7_tomcat7:v4 "/bin/bash /init.sh" 3 seconds ago Up 2 seconds 0.0.0.0:49155->8080/tcp, :::49155->8080/tcp trusting_dijkstra |
也可以提前把dockerfile中提到的文件下载下来,然后修改文件,这里我从新把saolei.zip,解压,重新归档为tar -zcvf saolei.tar.gz saolei
1 [root@docker01 saolei]# curl -o saolei.tar.gz http://192.168.26.111/software/saolei.tar.gz
2 [root@docker01 saolei]# ls
3 dockerfile init.sh saolei.tar.gz
4 [root@docker01 saolei]# vim dockerfile
5 FROM centos:7
6 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo 7 RUN yum -y install tomcat
8 WORKDIR /var/lib/tomcat/webapps/
9 ADD saolei.tar.gz .
10 RUN mv saolei ROOT 11
12
13 ADD init.sh /init.sh
14 EXPOSE 8080
15 CMD ["/bin/bash","/init.sh"]
16 [root@docker01 saolei]# docker build -t centos7_tomcat7:v5 --network=host .
17 [root@docker01 saolei]# docker ps -a -l
18 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19 0ab69820f3c7 centos7_tomcat7:v5 "/bin/bash /init.sh" 7 seconds ago
Up 6 seconds 0.0.0.0:49156->8080/tcp, :::49156->8080/tcp tender_meitner
20
1 [root@docker01 saolei]# docker exec -it 0ab69820f3c7 /bin/bash 2 [root@0ab69820f3c7 webapps]# ls 3 ROOT 4 [root@0ab69820f3c7 webapps]# pwd 5 /var/lib/tomcat/webapps |
9.2 可道云案例
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数) ,案例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@docker01 dockerfile]# mkdir kod
[root@docker01 dockerfile]# cd kod/
[root@docker01 kod]# ls
dockerfile kodexplorer4.40.zip nginx.conf [root@docker01 kod]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024; }
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /code;
index index.php index.html index.htm; }
location ~ \.php$ { root /code;
fastcgi_pass 127.0.0.1:9000;
25 fastcgi_index index.php;
26 fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
27 include fastcgi_params; 28 }
29 } 30 }
31 [root@docker01 kod]# vim dockerfile
32 [root@docker01 kod]# cat dockerfile
33 FROM centos:7
34 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo
35 RUN yum clean all
36 RUN yum -y install nginx php-fpm php-gd php-mbstring unzip
37 RUN sed -i '/^user/c user=nginx' /etc/php-fpm.d/www.conf
38 RUN sed -i '/^group/c group=nginx' /etc/php-fpm.d/www.conf
39 COPY nginx.conf /etc/nginx/nginx.conf
40 RUN mkdir /code
41 WORKDIR /code
42 COPY kodexplorer4.40.zip .
43 RUN unzip kodexplorer4.40.zip
44 RUN chown -R nginx.nginx .
45 ADD init.sh /init.sh
46 ENTRYPOINT ["/bin/bash","/init.sh"] 47
48
49 [root@docker01 kod]# vim init.sh
50 [root@docker01 kod]# cat init.sh
53 echo "$1" >> /etc/nginx/nginx.conf
54 nginx -g 'daemon off;'
55 [root@docker01 kod]# docker build -t kod:v3 --network=host .
56 [root@docker01 kod]# docker run -d -P kod:v3 '#testtest'
57 a9eb681a966288797d5fe096d035ae7d1649b20216d1f844cfd7bb1f0abb81c9
58 [root@docker01 kod]# docker exec -it a9eb681a96 /bin/bash
59 [root@a9eb681a9662 code]# tail -3 /etc/nginx/nginx.conf 60 }
61 }
62 #testtest
ENV环境变量
上个dockerfile中增加安装openssh-server
1 [root@shixun1 kod]# cat dockerfile
2 FROM centos:7
3 RUN rm -rf /etc/yum.repos.d/*
4 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo
5 RUN yum clean all
6 RUN yum -y install nginx php-fpm php-gd php-mbstring unzip
7 RUN sed -i '/^user/c user=nginx' /etc/php-fpm.d/www.conf
8 RUN sed -i '/^group/c group=nginx' /etc/php-fpm.d/www.conf
9 COPY nginx.conf /etc/nginx/nginx.conf
10 RUN mkdir /code
11 WORKDIR /code
12 COPY kodexplorer4.40.zip .
13 RUN unzip kodexplorer4.40.zip
14 RUN chown -R nginx.nginx .
15 ADD init.sh /init.sh
16 RUN yum -y install openssh-server initscripts
17 EXPOSE 80 22
18 ENTRYPOINT ["/bin/bash","/init.sh"]
19 [root@shixun1 kod]# cat init.sh
20 #!/bin/bash
21 php-fpm -D
22 /usr/sbin/sshd-keygen
23 /usr/sbin/sshd
24 nginx -g 'daemon off;'
25 [root@shixun1 kod]# docker build -t kod:v4 --network=host .
26 [root@shixun1 kod]# docker run -d -P kod:v4
27 d4c0d64e43f3ad43ff9939cd348e389211ee719100d3aeb30bd620bfb02c2cc2
28 [root@docker01 kod]# docker ps -a -l
29 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
30 d4c0d64e43f3 kod:v4 "/bin/bash /init.sh" About a minute ago Up About a minute 0.0.0.0:49158->22/tcp, :::49158->22/tcp, 0.0.0.0:49157- >80/tcp, :::49157->80/tcp elated_swartz
这里只是打开了端口,并没有配置相应的ssh服务
9.3 ssh连接容器
ssh服务配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@docker01 ~]# docker run -it -p 1022:22 centos:7 [root@0fa6b4e35ff1 /]# rpm -q sshd
package sshd is not installed
[root@0fa6b4e35ff1 /]# yum -y install openssh-server [root@0fa6b4e35ff1 /]# ls /etc/ssh/
moduli sshd_config
[root@0fa6b4e35ff1 /]# cat /usr/lib/systemd/system/sshd-keygen.service
[Unit]
Description=OpenSSH Server Key Generation
ConditionFileNotEmpty= | !/etc/ssh/ssh_host_rsa_key
ConditionFileNotEmpty= | !/etc/ssh/ssh_host_ecdsa_key
ConditionFileNotEmpty= | !/etc/ssh/ssh_host_ed25519_key PartOf=sshd.service sshd.socket
[Service]
ExecStart=/usr/sbin/sshd-keygen Type=oneshot
RemainAfterExit=yes
[root@0fa6b4e35ff1 /]# /usr/sbin/sshd-keygen
/usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory
Generating SSH2 RSA host key: /usr/sbin/sshd-keygen: line 63: success: command not found
23 Generating SSH2 ECDSA host key: /usr/sbin/sshd-keygen: line 105: success: command not found
24
25 Generating SSH2 ED25519 host key: /usr/sbin/sshd-keygen: line 126: success: command not found
26 [root@docker01 ~]# rpm -qf /etc/rc.d/init.d/functions
27 initscripts-9.49.49-1.el7.x86_64
28 [root@0fa6b4e35ff1 /]# yum -y install initscripts
29 [root@0fa6b4e35ff1 /]# /usr/sbin/sshd ##/usr/sbin/sshd -D 前台启动
30 [root@0fa6b4e35ff1 /]# ls /etc/ssh/
31 moduli ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
32 ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key sshd_config
33 [root@0fa6b4e35ff1 /]# [root@docker01 ~]# #### ctrl+p . ctrl+q
34 [root@docker01 ~]# docker ps -a -l
35 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36 0fa6b4e35ff1 centos:7 "/bin/bash" 16 minutes ago Up 16 minutes
0.0.0.0:1022->22/tcp, :::1022->22/tcp nifty_goldstine
连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@docker01 ~]# ssh root@192.168.26.201 -p 1022 The authenticity of host '[192.168.26.201]:1022 ([192.168.26.201]:1022)' can't be established. ECDSA key fingerprint is SHA256:gS+77q8e+8PLYzTYLPVPrL8cxwPhs7t1QnRdYdS2vS4. ECDSA key fingerprint is MD5:32:10:d0:30:64:bf:db:d4:16:ff:ed:bc:fa:38:ba:1c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.26.201]:1022' (ECDSA) to the list of known hosts. root@192.168.26.201's password: [root@docker01 ~]# docker exec -it 0fa6b4e35ff1 /bin/bash [root@0fa6b4e35ff1 /]# echo '123456' | passwd --stdin root [root@docker01 ~]# ssh root@192.168.26.201 -p 1022 root@192.168.26.201's password: Last login: Wed Jun 30 08:28:53 2021 from 192.168.26.201 [root@0fa6b4e35ff1 ~]# exit logout Connection to 192.168.26.201 closed. |
提交为镜像
1 [root@docker01 ~]# docker commit 0fa6b4e35ff1 centos7_sshd:v1 2 [root@docker01 ~]# docker run -d -p 1023:22 centos7_sshd:v1 /usr/sbin/sshd -D 3 759278446cb07e89bcee342548512c393fa661b37f4730aecb41cade2d7bb1f0 4 [root@docker01 ~]# ssh root@192.168.26.201 -p 1023 |
9.4 接可道云
查看镜像top
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@docker01 ~]# docker top d4c0d64e43f3 UID PID PPID C STIME TTY TIME CMD root 32672 32650 0 15:48 ? 00:00:00 /bin/bash root 32705 32672 0 15:48 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf) polkitd 32706 32705 0 15:48 ? 00:00:00 php-fpm: pool www polkitd 32707 32705 0 15:48 ? 00:00:00 php-fpm: pool www polkitd 32708 32705 0 15:48 ? 00:00:00 php-fpm: pool www polkitd 32709 32705 0 15:48 ? 00:00:00 php-fpm: pool www polkitd 32710 32705 0 15:48 ? 00:00:00 php-fpm: pool www root 32732 32672 0 15:48 ? 00:00:00 /usr/sbin/sshd root 32733 32672 0 15:48 ? 00:00:00 nginx: master process nginx -g daemon off; polkitd 32734 32733 0 15:48 ? 00:00:00 nginx: worker process |
尝试连接刚才创建的容器,但是因为没有密码所以连接失败
1 [root@docker01 ~]# ssh root@192.168.26.201 -p 49158 2 The authenticity of host '[192.168.26.201]:49158 ([192.168.26.201]:49158)' can't be established. 3 ECDSA key fingerprint is SHA256:qvqj9tIuPuBy/cCRu+7zftAopwK9RLTciqOlDflhQqo. 4 ECDSA key fingerprint is MD5:9b:f5:2a:fd:23:90:b8:00:83:ba:72:58:e6:6a:02:39. 5 Are you sure you want to continue connecting (yes/no)? yes 6 Warning: Permanently added '[192.168.26.201]:49158' (ECDSA) to the list of known hosts. 7 root@192.168.26.201's password: |
修改脚本,增加设置密码步骤,重新构建,创建容器,可以正常连接
1 [root@docker01 kod]# cat init.sh
2 #!/bin/bash
3 php-fpm -D
4 /usr/sbin/sshd-keygen
5 /usr/sbin/sshd
6 echo "123456" | passwd --stdin root
7 nginx -g 'daemon off;'
8 [root@docker01 kod]# docker build -t kod:v5 --network=host .
9 [root@docker01 kod]# docker run -d -P kod:v5
10 96294fe411f50b55c3bf51be9b1d29cd4440e3577c5e4fe6771cfb792c2fb083
11 [root@docker01 kod]# docker ps -a -l
12 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
13 96294fe411f5 kod:v5 "/bin/bash /init.sh" 6 seconds ago Up 5 seconds
0.0.0.0:49160->22/tcp, :::49160->22/tcp, 0.0.0.0:49159->80/tcp, :::49159- >80/tcp awesome_tharp
14 [root@docker01 kod]# ssh root@192.168.26.201 -p 49160
15 The authenticity of host '[192.168.26.201]:49160 ([192.168.26.201]:49160)' can't be established.
16 ECDSA key fingerprint is SHA256:fzRILR9Bf/CtNVfGxxuzMqB3O01ESbME2cFyKtVWd/A.
17 ECDSA key fingerprint is
MD5:5d:af:69:a7:ca:3f:3d:45:9f:69:ec:fa:d5:f4:b3:00.
18 Are you sure you want to continue connecting (yes/no)? yes
19 Warning: Permanently added '[192.168.26.201]:49160' (ECDSA) to the list of known hosts.
20 root@192.168.26.201's password:
21 [root@96294fe411f5 ~]# exit
22 logout
23 Connection to 192.168.26.201 closed.
也可以让用户自定义密码,第一种方式,密码修改为$1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@docker01 kod]# cat init.sh # !/bin/bash
/usr/sbin/sshd-keygen
/usr/sbin/sshd
echo "$1" | passwd --stdin root nginx -g 'daemon off;'
[root@docker01 kod]# cat dockerfile FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo
RUN yum clean all
RUN yum -y install nginx php-fpm php-gd php-mbstring unzip RUN sed -i '/^user/c user=nginx' /etc/php-fpm.d/www.conf
RUN sed -i '/^group/c group=nginx' /etc/php-fpm.d/www.conf COPY nginx.conf /etc/nginx/nginx.conf
RUN mkdir /code WORKDIR /code
COPY kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip RUN chown -R nginx.nginx .
RUN yum -y install openssh-server initscripts EXPOSE 80 22
24 ADD init.sh /init.sh
25 ENTRYPOINT ["/bin/bash","/init.sh"]
26 [root@docker01 kod]# docker build -t kod:v6 --network=host .
27 [root@docker01 kod]# docker run -d -P kod:v6 redhat
28 ec7d2fe3c7d9d7061e18d3e695f2f579888331945bbd89458934d696c231fc71
29 [root@docker01 kod]# docker ps -a -l
30 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
31 ec7d2fe3c7d9 kod:v6 "/bin/bash /init.sh … " 5 seconds ago Up 4
seconds 0.0.0.0:49162->22/tcp, :::49162->22/tcp, 0.0.0.0:49161->80/tcp, :::49161->80/tcp infallible_robinson
32 [root@docker01 kod]# ssh root@192.168.26.201 -p 49162
33 The authenticity of host '[192.168.26.201]:49162 ([192.168.26.201]:49162)' can't be established.
34 ECDSA key fingerprint is SHA256:W/Y3Lah1+qEmKIC4+Z0mzVTiR4SsrKiY3Pg+ushO8dU.
35 ECDSA key fingerprint is
MD5:33:0c:f8:3c:bb:b1:c0:53:42:05:1d:9c:6a:8e:a7:15.
36 Are you sure you want to continue connecting (yes/no)? yes
37 Warning: Permanently added '[192.168.26.201]:49162' (ECDSA) to the list of known hosts.
38 root@192.168.26.201's password:
39 [root@ec7d2fe3c7d9 ~]# ls
40 anaconda-ks.cfg
利用ENV环境变量,设置初始密码,做之前,先了解如下示例:
1 [root@docker01 ~]# docker run -it --env "SSH_PWD=123456" centos:7 2 [root@a1e6629e643f /]# env | grep SSH 3 SSH_PWD=123456 4 [root@a1e6629e643f /]# echo $SSH_PWD 5 123456 6 [root@a1e6629e643f /]# |
接着修改dockerfile和init.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@docker01 kod]# cat dockerfile FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo
RUN yum clean all
RUN yum -y install nginx php-fpm php-gd php-mbstring unzip RUN sed -i '/^user/c user=nginx' /etc/php-fpm.d/www.conf
RUN sed -i '/^group/c group=nginx' /etc/php-fpm.d/www.conf COPY nginx.conf /etc/nginx/nginx.conf
RUN mkdir /code WORKDIR /code
COPY kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip RUN chown -R nginx.nginx .
RUN yum -y install openssh-server initscripts EXPOSE 80 22
ENV SSH_PWD=123456
ADD init.sh /init.sh
19 ENTRYPOINT ["/bin/bash","/init.sh"]
20 [root@docker01 kod]# cat init.sh
23 /usr/sbin/sshd-keygen
24 /usr/sbin/sshd
25 if [ ! -z $1 ];then
26 SSH_PWD=$1
27 fi
28 echo "$SSH_PWD" | passwd --stdin root
29 nginx -g 'daemon off;'
构建测试,不指定密码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@docker01 kod]# docker build -t kod:v7 --network=host . [root@docker01 kod]# docker run -d -P kod:v7 fada24bdf24e5d9d98c82d204fdf66aa5b1012276007cbc97a2b8181803ce279 [root@docker01 kod]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fada24bdf24e kod:v7 "/bin/bash /init.sh" 20 seconds ago Up 19 seconds 0.0.0.0:49164->22/tcp, :::49164->22/tcp, 0.0.0.0:49163->80/tcp, :::49163->80/tcp cranky_germain [root@docker01 kod]# ssh root@192.168.26.201 -p 49164 The authenticity of host '[192.168.26.201]:49164 ([192.168.26.201]:49164)' can't be established. ECDSA key fingerprint is SHA256:FMwKmAcAGx6VQ2LjZtRVD1MY33sFoq0CQPeezKCEDmY. ECDSA key fingerprint is MD5:ef:38:8e:35:ff:c1:b3:ea:fa:c0:de:87:f2:19:b5:76. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.26.201]:49164' (ECDSA) to the list of known hosts. root@192.168.26.201's password: [root@fada24bdf24e ~]# logout Connection to 192.168.26.201 closed. |
再次测试,指定密码, 使用指定密码登录,成功,如果用户不指定密码,则使用123456
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@docker01 kod]# docker run -d -P kod:v7 888888 02fa9cce395f675f52dad31f4a51b8126bc73d2ed355f2c0c5d8261a75729a1b [root@docker01 kod]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 02fa9cce395f kod:v7 "/bin/bash /init.sh … " 3 seconds ago Up 2 seconds 0.0.0.0:49166->22/tcp, :::49166->22/tcp, 0.0.0.0:49165->80/tcp, :::49165->80/tcp serene_northcutt [root@docker01 kod]# ssh root@192.168.26.201 -p 49166 The authenticity of host '[192.168.26.201]:49166 ([192.168.26.201]:49166)' can't be established. ECDSA key fingerprint is SHA256:D3VC8FMmRsAVcxtaTrM77S6L+4zwQ+79cxtTPo2f0HM. ECDSA key fingerprint is MD5:c9:98:4d:d5:c4:dd:29:87:1c:50:42:d2:89:7b:89:27. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.26.201]:49166' (ECDSA) to the list of known hosts. root@192.168.26.201's password: [root@02fa9cce395f ~]# |
也可以这样做
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@docker01 kod]# docker run -d --env "SSH_PWD=sddfsfdf" -P kod:v7 90642ebe32f513e7b0e144abab16e4b94946f00b23bb5bbdf7193aedc81fff10 [root@docker01 kod]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90642ebe32f5 kod:v7 "/bin/bash /init.sh" 2 seconds ago Up 1 second 0.0.0.0:49168->22/tcp, :::49168->22/tcp, 0.0.0.0:49167->80/tcp, :::49167- >80/tcp confident_aryabhata [root@docker01 kod]# ssh root@192.168.26.201 -p 49168 The authenticity of host '[192.168.26.201]:49168 ([192.168.26.201]:49168)' can't be established. ECDSA key fingerprint is SHA256:muosZD2TGaGVd3fSduvnA/kJjyCTYxKp2wXbcXFHmS4. ECDSA key fingerprint is MD5:28:6c:3e:ba:76:af:fc:ad:ff:ac:8b:96:06:12:68:41. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.26.201]:49168' (ECDSA) to the list of known hosts. root@192.168.26.201's password: [root@90642ebe32f5 ~]# |
VOLUME
1 [root@docker01 kod]# cat dockerfile
2 FROM centos:7
3 RUN rm -rf /etc/yum.repos.d/*
4 RUN curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo
5 RUN yum clean all
6 RUN yum -y install nginx php-fpm php-gd php-mbstring unzip
7 RUN sed -i '/^user/c user=nginx' /etc/php-fpm.d/www.conf
8 RUN sed -i '/^group/c group=nginx' /etc/php-fpm.d/www.conf
9 COPY nginx.conf /etc/nginx/nginx.conf
10 RUN mkdir /code
11 WORKDIR /code
12 COPY kodexplorer4.40.zip .
13 RUN unzip kodexplorer4.40.zip
14 RUN chown -R nginx.nginx .
15 RUN yum -y install openssh-server initscripts
16 EXPOSE 80 22
17 ENV SSH_PWD=123456
18 ADD init.sh /init.sh
20 ENTRYPOINT ["/bin/bash","/init.sh"]
21 [root@docker01 kod]# docker build -t kod:v8 --network=host .
22 [root@docker01 kod]# docker run -d -p 80:80 kod:v8
23 [root@docker01 kod]# docker ps -a -l
24 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25 dbf3d7dc206a kod:v8 "/bin/bash /init.sh" 9 minutes ago Up 9 minutes 22/tcp, 0.0.0.0:80->80/tcp, :::80->80/tcp beautiful_napier
访问,设置密码,登录查看卷,上传文件测试
image-20210701093551640
1 [root@docker01 admin]# pwd 2 /var/lib/docker/volumes/94dd0ad9d2716fc8460e7358c6028cb25bf7d215f5dd3e881985d 455280b1f77/_data/data/User/admin 3 [root@docker01 admin]# ls home/ 4 1.txt desktop 图片 我的文档 视频 音乐 |
容器删除,卷依然存在
1 [root@docker01 admin]# docker rm -f `docker ps -a -q` 2 e86bdef67b77 3 [root@docker01 admin]# docker volume ls 4 DRIVER VOLUME NAME 5 local 94dd0ad9d2716fc8460e7358c6028cb25bf7d215f5dd3e881985d455280b1f77 6 local xiaoniao |
再次创建新的容器,刚才上传的文件依然存在,并且是登录状态,这个是跟可道云的session有关, session位置在
1 [root@docker01 admin]# docker run -d -p 80:80 --volume 94dd0ad9d2716fc8460e7358c6028cb25bf7d215f5dd3e881985d455280b1f77:/code kod:v8 2 6fb46a8a74607329b2afe4745b51a1a465dc85c757b4292cc58f1f55f0579db5 3 [root@docker01 admin]# cd /var/lib/docker/volumes/94dd0ad9d2716fc8460e7358c6028cb25bf7d215f5dd3e881985d 455280b1f77/_data/ 4 [root@docker01 _data]# ls 5 app ChangeLog.md config data index.php kodexplorer4.40.zip plugins README.MD static 6 [root@docker01 _data]# cd data/session/ 7 [root@docker01 session]# ls 8 index.html sess_dftv5rgjrpcd38tgc6t192cu65 9 |
删除容器,重新创建
1 [root@docker01 session]# docker rm -f `docker ps -a -q` 2 6fb46a8a7460 3 [root@docker01 session]# docker run -d -p 80:80 kod:v8 4 17a4780d868ca7406e4de9454930cb52a5d7362ec41b8b6f0ae038246b36df6f |
访问,上传文件
image-20210701093947169
终止容器,重新创建,卷基于停止的容器的卷
1 [root@docker01 ~]# docker kill elated_wilson 2 elated_wilson 3 [root@docker01 ~]# docker ps -a 4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5 17a4780d868c kod:v8 "/bin/bash /init.sh" 3 minutes ago Exited (137) About a minute ago elated_wilson 6 [root@docker01 ~]# docker run -d -p 80:80 --volumes-from 17a4780d868c kod:v8 7 5b7118fd455c01bd691e4ad3c39c484afc1f02074f162f72b0f4a6ec163e3487 |
内容依然在
image-20210701094346058
10、docker镜像的分层
镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。 修改dockerfile之后,再次构建速度快
dockerfile 优化:
1 :尽可能选择体积小linux ,alpine
2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)
3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾
4: 使用.dockerignore,减少不必要的文件ADD . /html
1 [root@docker02 ~]# docker images
2 REPOSITORY TAG IMAGE ID CREATED SIZE
3 centos 7 9f38484d220f 2 years ago 202MB
4 [root@docker02 ~]# docker run -it centos:7
5 [root@045e0906a72b /]# cp /etc/services .
6 [root@045e0906a72b /]# ls
7 anaconda-post.log dev home lib64 mnt proc run services sys usr
8 bin etc lib media opt root sbin srv tmp var
9 [root@045e0906a72b /]# exit
10 exit
11 [root@docker02 ~]# docker diff 045e0906a72b
12 C /root
13 A /root/.bash_history
14 A /services
15 [root@docker02 ~]# docker commit 045e0906a72b test:v1
16 sha256:d5baa6599326845d3f003fbacd5abffeb014cfdcafa8559f8e14f9c314dd1996
17 [root@docker02 ~]# docker images
18 REPOSITORY TAG IMAGE ID CREATED SIZE
19 test v1 d5baa6599326 3 minutes ago 202MB
20 centos 7 9f38484d220f 2 years ago 202MB
21 [root@docker02 ~]# docker image history centos:7
22 IMAGE CREATED CREATED BY SIZE COMMENT
23 9f38484d220f 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
24 <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
25 <missing> 2 years ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
26 [root@docker02 ~]# docker image history test:v1
27 IMAGE CREATED CREATED BY SIZE COMMENT
28 d5baa6599326 5 minutes ago /bin/bash 670kB
29 9f38484d220f 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
30 <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
31 <missing> 2 years ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
如果要删除这个镜像,是删除不掉的,只能删除标签,因为被占用
1 [root@docker02 ~]# docker rmi centos:7
2 Error response from daemon: conflict: unable to remove repository reference "centos:7" (must force) - container 045e0906a72b is using its referenced
image 9f38484d220f
3 [root@docker02 ~]# docker rm -f `docker ps -a -q`
4 045e0906a72b
5 [root@docker02 ~]# docker rmi centos:7
6 Untagged: centos:7
7 [root@docker02 ~]# docker image history test:v1
8 IMAGE CREATED CREATED BY SIZE COMMENT
9 d5baa6599326 6 minutes ago /bin/bash 670kB
10 9f38484d220f 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
11 <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
12 <missing> 2 years ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
13 [root@docker02 ~]# docker images
14 REPOSITORY TAG IMAGE ID CREATED SIZE
15 test v1 d5baa6599326 6 minutes ago 202MB
16 [root@docker02 ~]# docker save -o docker_test.tar.gz test:v1
17 [root@docker02 ~]# docker rmi test:v1
18 Untagged: test:v1
19 Deleted:
sha256:d5baa6599326845d3f003fbacd5abffeb014cfdcafa8559f8e14f9c314dd1996
20 Deleted:
sha256:d9474aff244f2be5c98602c18af194bfc6b780e0efa5a65a1b426d8fea51244f
21 Deleted:
sha256:9f38484d220fa527b1fb19747638497179500a1bed8bf0498eb788229229e6e1
22 Deleted:
sha256:d69483a6face4499acb974449d1303591fcbb5cdce5420f36f8a6607bda11854
23 [root@docker02 ~]# docker load -i docker_test.tar.gz
24 d69483a6face: Loading layer 209.5MB/209.5MB
25 7cc0cd9fcc03: Loading layer 673.8kB/673.8kB
26 Loaded image: test:v1
再次导入的时候,只会导入一个标签,因为这一层硬盘上已经有了
1 [root@docker02 ~]# docker load -i docker_test.tar.gz 2 Loaded image: test:v1 3 [root@docker02 ~]# sz docker_test.tar.gz |
查看docker存储驱动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@docker02 ~]# docker info Client:
Context: default
Debug Mode: false Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 0 Running: 0
Paused: 0
Stopped: 0 Images: 1
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
21 userxattr: false
22 Logging Driver: json-file
23 Cgroup Driver: cgroupfs
24 Cgroup Version: 1
25 Plugins:
26 Volume: local
27 Network: bridge host ipvlan macvlan null overlay
28 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
29 Swarm: inactive
30 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
31 Default Runtime: runc
32 Init Binary: docker-init
33 containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
34 runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
35 init version: de40ad0
36 Security Options:
37 seccomp
38 Profile: default
39 Kernel Version: 3.10.0-1127.el7.x86_64
40 Operating System: CentOS Linux 7 (Core)
41 OSType: linux
42 Architecture: x86_64
43 CPUs: 2
44 Total Memory: 1.934GiB
45 Name: docker02
46 ID: EW4T:2ZXS:7GFJ:VAB4:TF5I:NXEP:PPOD:BUTV:CR3G:OMSJ:7OC3:LLPY
47 Docker Root Dir: /var/lib/docker
48 Debug Mode: false
49 Registry: https://index.docker.io/v1/
51 Experimental: false
52 Insecure Registries: 53 127.0.0.0/8
54 Live Restore Enabled: false 55
进入相应目录
[root@docker02 ~]# cd /var/lib/docker/image/
[root@docker02 image]# ls overlay2
[root@docker02 image]# cd overlay2/
[root@docker02 overlay2]# ls
distribution imagedb layerdb repositories.json [root@docker02 overlay2]# tree
.
├── distribution
├── imagedb
│ ├── content
│ │ └── sha256
│ │ └──
d5baa6599326845d3f003fbacd5abffeb014cfdcafa8559f8e14f9c314dd1996
└── metadata
└── sha256
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

│ │
16 ├── layerdb
17 │ ├── mounts
18 │ ├── sha256
19 │ │ ├── d69483a6face4499acb974449d1303591fcbb5cdce5420f36f8a6607bda11854
20 │ │ │ ├── cache-id
21 │ │ │ ├── diff
22 │ │ │ ├── size
23 │ │ │ └── tar-split.json.gz
24 │ │ └── d9474aff244f2be5c98602c18af194bfc6b780e0efa5a65a1b426d8fea51244f
25 │ │ ├── cache-id
26 │ │ ├── diff
27 │ │ ├── parent
28 │ │ ├── size
29 │ │ └── tar-split.json.gz
30 │ └── tmp
31 └── repositories.json 32
33 12 directories, 11 files
查看之前kod:v8的镜像历史

[root@docker01 ~]# docker image history kod:v8 IMAGE CREATED CREATED BY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SIZE COMMENT
9b6c8a4b5652 About an hour ago /bin/sh -c #(nop) ENTRYPOINT
["/bin/bash" "… 0B
fb4e69a23a51 About an hour ago /bin/sh -c #(nop) VOLUME [/code] 0B
c21a50eaf660 18 hours ago /bin/sh -c #(nop) ADD
file:a78ca579b744a2b69… 154B
476fae34b64a 18 hours ago /bin/sh -c #(nop) ENV SSH_PWD=123456
0B
9dedd9fc6458 18 hours ago /bin/sh -c #(nop) EXPOSE 22 80
0B
ea3b21676419 18 hours ago /bin/sh -c yum -y install openssh-server
ini… 106MB
/bin/sh -c chown -R nginx.nginx .
hours
hours
hours
ago
ago
ago
13.9MB ago
ago
ago
19
19
19
3e597e138290
46.4MB 3394434bb1a3
/bin/sh -c unzip kodexplorer4.40.zip
/bin/sh -c #(nop) COPY
/bin/sh -c #(nop) WORKDIR /code
/bin/sh -c mkdir /code
/bin/sh -c #(nop) COPY
32.5MB 596efc848de5
a5f46411d0a3
file:4112a246afbb27df…
19
19
19
hours
hours
hours
0B
fb26070fea43 0B
914461f35430
file:e6a22acd8d3c3860…
628B
/bin/sh -c sed -i '/^group/c group=nginx'
ago
ago
ago
72781bb9ac95 19 hours /e… 10kB
9be234e619bc 19 hours /etc… 10kB
9135a7a16575 19 hours php-… 220MB
/bin/sh -c sed -i '/^user/c user=nginx' /bin/sh -c yum -y install nginx php-fpm
18 97ff86cedad2 19 hours ago /bin/sh -c yum clean all
22.6MB
19 700193edb5b4 19 hours ago /bin/sh -c curl -o /etc/yum.repos.d/centos7.… 226B
20 abe881cc193f 19 hours ago /bin/sh -c rm -rf /etc/yum.repos.d/* 0B
21 9f38484d220f 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
22 <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label- schema.sc… 0B
23 <missing> 2 years ago /bin/sh -c #(nop) ADD
file:074f2c974463ab38c… 202MB
24 [root@docker01 ~]# docker images kod:v8
25 REPOSITORY TAG IMAGE ID CREATED SIZE
26 kod v8 9b6c8a4b5652 About an hour ago 643MB
优化之前的dockerfile,构建,查看大小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [root@docker01 kod]# cat dockerfile FROM centos:7 RUN rm -rf /etc/yum.repos.d/* && \ curl -o /etc/yum.repos.d/centos7.repo http://192.168.26.111/centos7.repo && \ yum -y install nginx php-fpm php-gd php-mbstring unzip openssh-server initscripts && \ yum clean all && \ sed -i '/^user/c user=nginx' /etc/php-fpm.d/www.conf && \ sed -i '/^group/c group=nginx' /etc/php-fpm.d/www.conf COPY nginx.conf /etc/nginx/nginx.conf RUN mkdir /code WORKDIR /code COPY kodexplorer4.40.zip . RUN unzip kodexplorer4.40.zip && \ chown -R nginx.nginx . && rm -rf kodexplorer4.40.zip EXPOSE 80 22 ENV SSH_PWD=123456 ADD init.sh /init.sh VOLUME /code ENTRYPOINT ["/bin/bash","/init.sh"] [root@docker01 kod]# docker build -t kod:v9 --network=host . [root@docker01 kod]# docker images kod:v9 | ||||
REPOSITORY kod | TAG v9 | IMAGE ID c217ed940be3 | CREATED 58 seconds ago | SIZE 398MB | |
11、容器之间的互联
docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。
--link的格式:
--link :alias
其中, name和id是源容器的name和id ,alias是源容器在link下的别名。
docker run -d -p 80:80 nginx
docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash ping web01
lb ---> nginx 172.17.0.4 --> db01 172.17.0.3
--> nfs01 172.17.0.2
使用docker运行zabbix-server
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
容器间互相通讯,默认情况下,容器之间网络就是通的
1 2 3 4 5 6 7 8 9 10 11 12 | [root@docker01 ~]# docker rm -f `docker ps -a -q` [root@docker01 ~]# docker run -d --name nginx centos7_nginx:v2 73b680c1debdb1cfcdf9810421c5d43da09efa60b61b2e9f07d139868133fb28 [root@docker01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73b680c1debd centos7_nginx:v2 "nginx -g 'daemon of… " 5 seconds ago Up 3 seconds nginx [root@docker01 ~]# docker exec -it nginx /bin/bash [root@73b680c1debd /]# hostname -i 172.17.0.2 [root@73b680c1debd /]# exit exit |
运行容器,测试通信
1 2 3 4 5 6 7 8 9 10 | [root@docker01 ~]# docker run -it centos:7 /bin/bash [root@349f88e506ac /]# hostname -i 172.17.0.3 [root@349f88e506ac /]# curl -I 172.17.0.2 HTTP/1.1 403 Forbidden Server: nginx/1.20.1 Date: Thu, 01 Jul 2021 02:43:53 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive |
但是因为IP是随机分配的,所以这种不合适把当前容器和名为nginx的容器链接起来,其中--link
nginx:webnginx是上面启动的容器的名字,这里作为源容器, web是该容器在link下的别名,通俗易懂的讲,站在node容器的角度, nginx和web都是上面193f1205d723容器的名字,并且作为容器的
hostname , node用这2个名字中的哪一个都可以访问到193f1205d723容器并与之通信(docker通过DNS自动解析)。(依靠主机名实现通讯,无需关注具体的IP地址)
[root@docker01 ~]# docker run -it --link nginx:web centos7_nginx:v2 /bin/bash
[root@0c482475b748 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 web 73b680c1debd nginx
172.17.0.3 0c482475b748
[root@0c482475b748 /]# hostname -i
172.17.0.3
[root@0c482475b748 /]# ping web
PING web (172.17.0.2) 56(84) bytes of data.
64 bytes from web (172.17.0.2): icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from web (172.17.0.2): icmp_seq=2 ttl=64 time=0.112 ms ^C
--- web ping statistics ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
20 rtt min/avg/max/mdev = 0.089/0.100/0.112/0.015 ms
21 [root@0c482475b748 /]#
22 [root@docker01 ~]# docker run -it --link nginx:nginx centos7_nginx:v2 /bin/bash
23 [root@fcd91dd91c94 /]# cat /etc/hosts
24 127.0.0.1 localhost
25 ::1 localhost ip6-localhost ip6-loopback
26 fe00::0 ip6-localnet
27 ff00::0 ip6-mcastprefix
28 ff02::1 ip6-allnodes
29 ff02::2 ip6-allrouters
30 172.17.0.2 nginx 73b680c1debd
31 172.17.0.3 fcd91dd91c94
32 [root@fcd91dd91c94 /]# hostname -i 33 172.17.0.3
34 [root@fcd91dd91c94 /]# ping nginx
35 PING nginx (172.17.0.2) 56(84) bytes of data.
36 64 bytes from nginx (172.17.0.2): icmp_seq=1 ttl=64 time=0.190 ms
37 64 bytes from nginx (172.17.0.2): icmp_seq=2 ttl=64 time=0.114 ms
38 ^C
39 --- nginx ping statistics ---
40 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
41 rtt min/avg/max/mdev = 0.114/0.152/0.190/0.038 ms
11.1 部署zabbix
导入所需的镜像
1 [root@docker01 opt]# ls 2 containerd docker-mysql-5.7.tar.gz xiaoniao.conf zabbix- server-mysql.tar.gz 3 dockerfile xiaoniao zabbix-java-gateway.tar.gz zabbix-web- nginx-mysql.tar.gz 4 [root@docker01 opt]# ls *.tar.gz 5 docker-mysql-5.7.tar.gz zabbix-server-mysql.tar.gz 6 zabbix-java-gateway.tar.gz zabbix-web-nginx-mysql.tar.gz 7 [root@docker01 opt]# for n in `ls *.tar.gz`;do docker load -i $n ;done |
[root@docker01 opt]# docker run --name mysql-server -t \
> -e MYSQL_DATABASE="zabbix" \
> -e MYSQL_USER="zabbix" \
> -e MYSQL_PASSWORD="zabbix_pwd" \
> -e MYSQL_ROOT_PASSWORD="root_pwd" \
> -d mysql:5.7 \
> --character-set-server=utf8 --collation-server=utf8_bin 9c0f3b4c24a2382b40ab0872960c8eb75162cfdf1e54afacd0098238fab99811 [root@docker01 opt]# docker run --name zabbix-java-gateway -t \
> -d zabbix/zabbix-java-gateway:latest
6c6fe291c20f0dfff598c94c8bf2704771860df7b24efc04e0709e2ad4f857aa [root@docker01 opt]# docker run --name zabbix-server-mysql -t \
> -e DB_SERVER_HOST="mysql-server" \
> -e MYSQL_DATABASE="zabbix" \
> -e MYSQL_USER="zabbix" \
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

16 > -e MYSQL_PASSWORD="zabbix_pwd" \
17 > -e MYSQL_ROOT_PASSWORD="root_pwd" \
18 > -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
19 > --link mysql-server:mysql \
20 > --link zabbix-java-gateway:zabbix-java-gateway \
21 > -p 10051:10051 \
22 > -d zabbix/zabbix-server-mysql:latest
23 53eeaaf24805ddfd0ea31b0f108d9f8b9373c8cae920c447b5aad1fc1a0e4740
24 [root@docker01 opt]# docker run --name zabbix-web-nginx-mysql -t \
25 > -e DB_SERVER_HOST="mysql-server" \
26 > -e MYSQL_DATABASE="zabbix" \
27 > -e MYSQL_USER="zabbix" \
28 > -e MYSQL_PASSWORD="zabbix_pwd" \
29 > -e MYSQL_ROOT_PASSWORD="root_pwd" \
30 > --link mysql-server:mysql \
31 > --link zabbix-server-mysql:zabbix-server \
32 > -p 80:80 \
33 > -d zabbix/zabbix-web-nginx-mysql:latest
34 cb47ab251eb37a231989f9db75b488b8cab12ced479eff08befcb3638fe7b0dd
12、docker registry(私有仓库)
12.1 普通的registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
上传镜像到私有仓库:
a:给镜像打标签
docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上传镜像
docker push 10.0.0.11:5000/centos6-sshd:v3
如果遇到报错:
The push refers to repository [10.0.0.11:5000/centos6.9_ssh]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解决方法:
vim /etc/docker/daemon.json {
"insecure-registries": ["10.0.0.11:5000"] }
systemctl restart docker
创建私有仓库
1 [root@docker01 opt]# docker load -i registry.tar.gz 2 [root@docker01 opt]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry |
注:创建容器时添加参数 --restart=always 后,当 docker 重启时,容器自动启动。
官方镜像和私有镜像区别就在于名字,下载一个私有仓库的镜像,推送到我们自己的仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@docker02 ~]# docker pull daocloud.io/huangzhichong/alpine-cn:latest [root@docker02 ~]# docker images | |||
REPOSITORY SIZE test 202MB | TAG v1 latest | IMAGE ID d5baa6599326 e8289dcc1d4b | CREATED 32 hours ago 4 years ago | |
3.98MB [root@docker02 ~]# docker tag e8289dcc1d4b 192.168.26.201:5000/alpine:latest [root@docker02 ~]# docker images | ||||
REPOSITORY SIZE test 202MB 192.168.26.201:5000/alpine 3.98MB | TAG v1 latest latest | IMAGE ID d5baa6599326 e8289dcc1d4b e8289dcc1d4b | CREATED 32 hours ago 4 years ago 4 years ago | |
[root@docker02 ~]# docker push 192.168.26.201:5000/alpine:latest The push refers to repository [192.168.26.201:5000/alpine] Get https://192.168.26.201:5000/v2/: http: server gave HTTP response to HTTPS client | ||||
报错,因为默认是使用https协议,修改,使用http方式上传
1 [root@docker02 ~]# cat /etc/docker/daemon.json 2 { 3 "insecure-registries": ["192.168.26.201:5000"] 4 } 5 [root@docker02 ~]# systemctl restart docker 6 [root@docker02 ~]# docker push 192.168.26.201:5000/alpine:latest |
查看
1 [root@docker01 opt]# ls /opt/myregistry/docker/registry/v2/repositories/alpine/_manifests/tags/ 2 latest |
使用浏览器查看镜像列表
image-20210702180405307以alpine为例,查看镜像的版本
image-20210702180513029
12.2 带basic认证的registry
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn zhongfei 123456 >> /opt/resgistry-var/auth/htpasswd
docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e
"REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e
"REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
1 [root@docker01 ~]# docker rm -f `docker ps -a -q` 2 [root@docker01 ~]# yum -y install httpd-tools 3 [root@docker01 ~]# mkdir /opt/registry-var/auth/ -p 4 [root@docker01 ~]# htpasswd -Bbn zhongfei 123456 >> /opt/registry- var/auth/htpasswd 5 [root@docker01 ~]# docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/ar/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSW_PATH=/auth/htpasswd" registry 6 1bd521e29316c5dd501dddb8a2afc522b6380715178eb469a4f5cd84a7fd5c42 7 [root@docker01 ~]# cat /opt/registry-var/auth/htpasswd 8 zhongfei:$2y$05$WcIgcnsYAGVjth2O8TfE5OOAoDN5DoHRyMK..ndtjR.EmBgzQMRGO |
刷新仓库页面
image-20210703093634244
客户端使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@docker02 ~]# docker login 192.168.26.201:5000 Username: zhongfei Password: WARNING ! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials- store Login Succeeded [root@docker02 ~]# cat /root/.docker/config.json { "auths": { "192.168.26.201:5000": { "auth": "emhvbmdmZWk6MTIzNDU2" } } } [root@docker02 ~]# docker pull 192.168.26.2015000/alpine:latest |
服务器自己下载的时候,也是需要修改自己配置文件的
1 [root@docker01 ~]# docker pull 192.168.26.201:5000/alpine:latest
2 Error response from daemon: Get https://192.168.26.201:5000/v2/: http: server gave HTTP response to HTTPS client
3 [root@docker01 ~]# vim /etc/docker/daemon.json 4 {
5 "registry-mirrors": ["https://registry.docker-cn.com"],
6 "insecure-registries": ["192.168.26.201:5000"] 7 }
8 [root@docker01 ~]# systemctl restart docker
9 [root@docker01 ~]# docker login 192.168.26.201:5000
10 Username: zhongfei
11 Password:
12 WARNING ! Your password will be stored unencrypted in /root/.docker/config.json.
13 Configure a credential helper to remove this warning. See
14 https://docs.docker.com/engine/reference/commandline/login/#credentials- store
15
16 Login Succeeded
17 [root@docker01 ~]# docker pull 192.168.26.201:5000/alpine:latest
删除镜像,是需要先进入到仓库中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@docker01 ~]# docker ps -a -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1bd521e29316 registry "/entrypoint.sh /etc… " 19 minutes ago Up 7 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp nostalgic_golick [root@docker01 ~]# docker exec -it nostalgic_golick /bin/sh / # which sh /bin/sh / # which bash / # cd /var/lib/registry/docker/registry/v2/ /var/lib/registry/docker/registry/v2 # ls blobs repositories /var/lib/registry/docker/registry/v2 # ls repositories/ alpine /var/lib/registry/docker/registry/v2 # rm -rf repositories/alpine/ /var/lib/registry/docker/registry/v2 # ls repositories/ /var/lib/registry/docker/registry/v2 # |
#这样只是删除了镜像名字,并没有全部删除执行垃圾回收命令
1 /var/lib/registry/docker/registry/v2 # registry garbage-collect /etc/docker/registry/config.yml 2 /var/lib/registry/docker/registry/v2 # du -smh * 3 0 blobs 4 0 repositories |
13、docker网络类型
None:不为容器配置任何网络功能, --net=none
Container:与另一个运行中的容器共享Network Namespace ,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace ,--network=host 性能最高
Bridge: Docker设计的NAT网络模型
13.1 Bridge类型
[root@docker02 ~]# docker images REPOSITORY
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
40
41
42
43
44
SIZE test 202MB
192.168.26.201:5000/alpine
3.98MB
daocloud.io/huangzhichong/alpine-cn 3.98MB
TAG
v1
latest
latest
IMAGE ID
d5baa6599326
e8289dcc1d4b
e8289dcc1d4b
CREATED
2 days ago
4 years ago
4 years ago
[root@docker02 ~]# docker run -d -it test:v1
27c6f9489462ec40a56c87a296fce2dbe76919dbd4a37dc75c73941fdf151a36
[root@docker02
CONTAINER ID
NAMES
27c6f9489462
~]# docker ps -a -l IMAGE COMMAND
test:v1 "/bin/bash"
CREATED
5 seconds ago
STATUS
Up 4 seconds
PORTS
modest_torvalds
[root@docker02 ~]# docker inspect modest_torvalds
....
"Networks": {
"bridge": {
"IPAMConfig": null, "Links": null,
"Aliases": null, "NetworkID":
"742254f9710d4ed5ede54c188d6de0a7c3125fd92a56641f15fb75d204e560e0", "EndpointID":
"c2cbb38ce68758c342ce473c52d098331f584b318d1d9e71b3c3401c7e6a73c0", "Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
.....
[root@docker02 ~]# docker attach modest_torvalds [root@27c6f9489462 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 7195 bytes 16713163 (15.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4996 bytes 273009 (266.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@27c6f9489462 /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface

45 0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
46 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 47
13.2 none类型
1 2 3 4 5 6 7 8 9 10 11 | [root@docker02 ~]# docker run -d -it --network=none test:v1 8aecc2b478ab9dab7b0fd59a209b4eb6b24d4df98d89b29ffac35140fe6f7213 [root@docker02 ~]# docker attach 8aecc2b478 [root@8aecc2b478ab /]# pwd / [root@8aecc2b478ab /]# ls anaconda-post.log dev home lib64 mnt proc run services sys usr bin etc lib media opt root sbin srv tmp var [root@8aecc2b478ab /]# cd /etc/sysconfig/ [root@8aecc2b478ab sysconfig]# ls anaconda rdisc |
13.3 host类型
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
[root@docker02 ~]# docker run -d -it --network=host test:v1 [root@docker02 ~]# docker exec -it ffc597ab3 /bin/sh
sh-4.2# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:8dff:fe6a:8a6b prefixlen 64 scopeid 0x20<link>
ether 02:42:8d:6a:8a:6b txqueuelen 0 (Ethernet)
RX packets 4996 bytes 203065 (198.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7192 bytes 16712953 (15.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.26.202 netmask 255.255.255.0 broadcast 192.168.26.255 inet6 fe80::a5:298c:1b7:5c8 prefixlen 64 scopeid 0x20<link>
inet6 fe80::6122:f2f2:5138:bc71 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:3b:7d:36 txqueuelen 1000 (Ethernet)
RX packets 427056 bytes 548798035 (523.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 270312 bytes 405039919 (386.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.202 netmask 255.255.255.0 broadcast 172.16.1.255 inet6 fe80::a8a:5f78:9907:6888 prefixlen 64 scopeid 0x20<link>
inet6 fe80::7d35:70af:99c2:753c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:3b:7d:40 txqueuelen 1000 (Ethernet)
RX packets 3407 bytes 267812 (261.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 110 bytes 9510 (9.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0
35 inet6 ::1 prefixlen 128 scopeid 0x10<host>
36 loop txqueuelen 1000 (Local Loopback)
37 RX packets 28 bytes 2744 (2.6 KiB)
38 RX errors 0 dropped 0 overruns 0 frame 0
39 TX packets 28 bytes 2744 (2.6 KiB)
40 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 41
42 sh-4.2# cat /etc/hosts #宿主机的解析文件也会同步进来
另外就是如果网络类型为host的时候,容器不需要端口映射,跟宿主机公用网络,相当于在宿主机上开了端口
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
40
41
42
43
[root@docker01 ~]# docker run -it --network=host kod:v1 /bin/bash [root@docker01 /]# ip a
bash: ip: command not found
[root@docker01 /]# yum -y install net-tools [root@docker01 /]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:96ff:fe9f:fc89 prefixlen 64 scopeid 0x20<link>
ether 02:42:96:9f:fc:89 txqueuelen 0 (Ethernet)
RX packets 66363 bytes 45151937 (43.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 84220 bytes 179118435 (170.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.26.201 netmask 255.255.255.0 broadcast 192.168.26.255 inet6 fe80::a5:298c:1b7:5c8 prefixlen 64 scopeid 0x20<link>
inet6 fe80::6122:f2f2:5138:bc71 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:03:e3:5a txqueuelen 1000 (Ethernet)
RX packets 1964397 bytes 2716025592 (2.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 669437 bytes 344771107 (328.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.201 netmask 255.255.255.0 broadcast 172.16.1.255 inet6 fe80::7d35:70af:99c2:753c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:03:e3:64 txqueuelen 1000 (Ethernet)
RX packets 3959 bytes 302518 (295.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 205 bytes 16832 (16.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 30 bytes 2868 (2.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 30 bytes 2868 (2.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@docker01 /]# ps -ef
44 UID PID PPID C STIME TTY TIME CMD
45 root 1 0 0 02:11 pts/0 00:00:00 /bin/bash
46 root 24 1 0 02:12 pts/0 00:00:00 ps -ef
47 [root@docker01 /]# rpm -q nginx
48 nginx-1.20.1-2.el7.x86_64
49 [root@docker01 /]# systemctl start nginx
50 Failed to get D-Bus connection: Operation not permitted
51 [root@docker01 /]# nginx
52 [root@docker01 /]# ps -ef
53 UID PID PPID C STIME TTY TIME CMD
54 root 1 0 0 02:11 pts/0 00:00:00 /bin/bash
55 root 28 1 0 02:13 ? 00:00:00 nginx: master process nginx
56 nginx 29 28 0 02:13 ? 00:00:00 nginx: worker process
57 root 30 1 0 02:13 pts/0 00:00:00 ps -ef
58 [root@docker01 /]# netstat -ntulp
59 Active Internet connections (only servers)
60 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
61 tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
-
62 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 28/nginx: master pr
63 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
-
64 tcp6 0 0 ::1:25 :::* LISTEN -
65 tcp6 0 0 :::22 :::* LISTEN -
66 [root@docker01 /]# php-fpm
67 [03-Jul-2021 02:14:18] NOTICE: fpm is running, pid 32
68 [03-Jul-2021 02:14:18] NOTICE: ready to handle connections
69 [03-Jul-2021 02:14:18] NOTICE: systemd monitor interval set to 10000ms 70
image-20210703101437643
1 2 3 4 5 6 7 8 | [root@docker01 ~]# ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:9000 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 [::1]:25 [::]:* LISTEN 0 128 [::]:22 [::]:* |
13.4 Container
与另一个运行中的容器共享Network Namespace
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 | [root@docker02 ~]# docker run -d -it test:v1 7a03bbf726c3dad54a54567ead6e096a4aa9fcece018260c32c2411b30a19e75 [root@docker02 ~]# docker run -it --network container:7a03bbf726c test:v1 [root@7a03bbf726c3 /]# hostname 7a03bbf726c3 [root@7a03bbf726c3 /]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 7a03bbf726c3 [root@7a03bbf726c3 /]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 6597 bytes 16680973 (15.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4789 bytes 262081 (255.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
查看网络类型
1 [root@docker02 ~]# docker ps -a -l 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3 2e2dcc3c6c7a test:v1 "/bin/bash" About a minute ago Up About a minute xenodochial_noyce 4 [root@docker02 ~]# docker inspect xenodochial_noyce | grep -i network 5 "NetworkMode": "container:7a03bbf726c3dad54a54567ead6e096a4aa9fcece018260c32c2411b30a19e75", 6 "NetworkSettings": { 7 "Networks": {} |


浙公网安备 33010602011771号