从零梳理 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和容器技术为什么会这么火爆?说白了,就是因为它“轻”。

在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是VMWareOpenStack

相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑” 出来。

在“子电脑”里,你可以和正常电脑一样运行程序,例如开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

3、启动第一个容器

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

xiaoniaofeifei.zip

[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

vi /init.sh

#!/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; }

http {

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

# !/bin/bash

php-fpm -D

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

phpwind_UTF8_8.7.1.zip

[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

2 # !/bin/bash

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; }

http {

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

51 # !/bin/bash

52 php-fpm -D

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

/init.sh

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

php-fpm -D

/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

21 # !/bin/bash

22 php-fpm -D

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

19 VOLUME /code

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/

50 Labels:

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

daocloud.io/huangzhichong/alpine-cn

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

daocloud.io/huangzhichong/alpine-cn

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": {}

posted @ 2026-07-08 16:00  乐维_lwops  阅读(12)  评论(0)    收藏  举报