Dokcer容器

1、明确我们学的是什么

我们学习的是容器技术,并不仅仅是docker,docker仅仅是遵循容器标准的一种实现,只要遵循了容器标准,就可以叫容器技术。比如说最流行的docker,或者红帽的podman都可以叫容器技术。docker仅仅是最开始实现容器技术的一个软件。docker不等于容器,仅仅是容器的一个子集。容器不是虚拟化。

2、docker的由来

2010年,几个年轻人,追求梦想,走向人生巅峰,在美国的旧金山成立了一家dotcloud公司,主要提供PaaS的云计算服务。被迫出现的产物,利益驱使下的产物。

3、docker解决了什么问题?

麻烦的开发环境,麻烦的测试环境,麻烦的集成环境,解决了一个最经典的问题:在我这跑的好好的,怎么到了你那里就不行了呢?上述例子就是一个测试问题,世界上不存在完全一模一样的叶子,也不可能存在完全一模一样的操作系统(测试环境)。但是我们想要这种理想的情况,在我这测试的结果就会和在你那一模一样了。就不会出现上述情况了。docker就彻底解决了这个问题,docker通过打包镜像,将测试环境封装到一个密闭的镜像中,随时随地的在任何地方复制这个镜像。就能实现几乎一模一样的测试环境。

集成环境指的是生产环境的部署阶段,比如说要搭建一个云平台,要在基础设施上安装各种各样的软件,在基础设施上安装软件就意味着各种各样的问题,因为软件是分版本的,不同的软件对系统的要求也不一样。集成环境就是大名鼎鼎的微服务架构。

4、docker的安装

1
2
3
4
5
6
#官方文档
https://docs.docker.com/

1、我们需要开启centos-extra仓库(linux8是默认开启的)
2、yum install docker-ce docker-ce-cli containerd.io
3、systemctl enable docker --now

5、Docker镜像

1、Docker镜像介绍

在安装完docker-ce之后,默认相当于安装好了docker-cli和docker-ce进程,启动docker-ce进程就算是运行起了docker,但是此时我们并没有可以直接使用的docker私有仓库。镜像其实是装好了特定应用的一个东西,镜像是静态的,容器是动态的。镜像运行起来就是容器,类似于程序和进程。镜像只会占用磁盘空间,但是容器会占用磁盘空间的同时也会占用cpu和内存。

镜像一般是存放在就镜像仓库中的,然后通过docker-cli提供的命令从仓库中拉取镜像,然后将镜像保存在本地,以便后续使用。镜像仓库中的镜像都是压缩过的,压缩的目的是减少镜像的大小,这样在网络传输的时候,可以减少带宽的压力,然后docker的客户端拉取了镜像之后,会对镜像进行解压。

默认情况下docker是需要配置镜像仓库的,一般在生产环境中会配置一个私有的镜像仓库,这样就可以保证镜像传输的安全和速度。

在internet上有很多开源厂商给我们提供了镜像仓库,可以连接这些仓库直接拉取(pull)。

2、Dockerhub介绍和使用

Docker公司为了实现docker容器技术的良好的生态圈,推出了和github类似的东西,叫做dockerhub,是一个公有仓库,任何人都可以在dockerhub上创建自己仓库,然后上传自己镜像(早期的时候)
dockerhub已经推出了收费服务
安装完docekr默认拉取的镜像就是在dockerhub拉的

3、配置dockerhub的镜像加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用阿里云配置镜像加速器  daemon 守护程序
docker image rm hello-world #删除镜像
docker container rm 656a796392b7 #删除运行中或者曾经运行中的容器

#配置
[root@docekr-ce ~]# cat /etc/docker/daemon.json
{
"data-root":"/data/docker",
"storage-driver":"overlay2",
"registry-mirrors": ["https://oym4jkot.mirror.aliyuncs.com"],
"insecure-registries":["registry.access.redhat.com","quay.io"],
"bip":"172.101.10.1/24",
"live-restore":true
}

4、配置docker的代理

有些情况下我们可能无法直接的访问到某些镜像仓库,但是有一个代理服务器可以访问到,就需要配置代理来访问到镜像仓库。

测试的环境,容器主机没有办法直接访问,但是有一个代理服务器,但是代理服务器的协议是socks5,docker没有办法直接访问socks代理,所以我们需要将socks5的代理转换成http或者https,一般是转换成http

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1、将socks5的代理转换成http代理
privoxy-3.0.31-1.el8.x86_64 # 可以将本地http的数据包转换成socks5

vim /etc/privoxy/config

[root@docker ~]# egrep '^listen-address' /etc/privoxy/config -A 1
listen-address 0.0.0.0:8118
forward-socks5 / 34.87.135.66:10800
[root@docker ~]# netstat -tunpl
tcp 0 0 0.0.0.0:8118 0.0.0.0:* LISTEN 1884/privoxy

2、配置docker使用http的代理
mkdir -p /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/proxy.conf
chmod 777 /etc/systemd/system/docker.service.d/proxy.conf

echo '[Service]
Environment="HTTP_PROXY=http://192.168.192.200:8118"
Environment="HTTP_PROXY=https://192.168.192.200:8118"
' >> /etc/systemd/system/docker.service.d/proxy.conf

systemctl daemon-reload
systemctl restart docker
3、拉取镜像

5、Docker镜像管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1、Docker镜像的拉取
docker pull 就是拉取镜像的命令,默认情况下,不指定仓库就是从dockerhub上拉取镜像,如果指定了仓库,就从对应的仓库中拉取镜像,前提是没有配置镜像仓库的配置文件

2、Docker镜像的删除
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 2 months ago 209MB
ubuntu latest f643c72bc252 3 months ago 72.9MB
hello-world latest bf756fb1ae65 14 months ago 13.3kB

强烈不建议通过IMAGE ID删除镜像,有可能会出现误删除的现象,因为docker存在repository和tag的概念,有可能存在不同的repository和不同的tag但是IMAGE ID是相同的情况,这样如果通过这个命令来删除,如果一样的,会造成同时删除情况
[root@docker ~]# docker image rm REPOSITORY:TAG

#如果有一个容器使用了你想要删除的镜像,你需要先删除这个容器,然后才能删除这个镜像
#如果不指定tag就会删除latest

[root@docker ~]# docker container rm fb6764367bb3
fb6764367bb3

3、Docker镜像的导出
[root@docker ~]# docker save ubuntu:latest -o ubuntu-latest.tar
[root@docker ~]# ls
anaconda-ks.cfg ubuntu-latest.tar
#导出的是压缩包,和从刚开始镜像中拉取的一样,-o参数表示输出为指定的文件

4、Docker镜像的导入
[root@docker ~]# docker load -i ubuntu-latest.tar
bacd3af13903: Loading layer 75.27MB/75.27MB
9069f84dbbe9: Loading layer 15.36kB/15.36kB
f6253634dc78: Loading layer 3.072kB/3.072kB
Loaded image: ubuntu:latest
#-i参数表示导入指定文件

5、docker正在运行镜像的提交,保存成镜像,保存镜像运行的状态
[root@docekr-ce ~]# docker commit -p 7ef60b2b9ddc vorabend/nginx:curl
sha256:ffa15a0bc447a1e90b0af6de6dd74d317a69109b951b214c31455ec8517f34dc

[root@docekr-ce ~]# docker images | grep curl
vorabend/nginx curl ffa15a0bc447 31 seconds ago 141MB

6、使用Dockerhub上创建自己的仓库

1
2
3
4
#首先我们需要理解dcoker的镜像仓库,镜像仓库的结构,大仓库,小仓库,tag,分析一下dockerhub的构成,dockerhub的镜像仓库是docker.io,当我们想要从dockerhub拉取我们需要的镜像的时候,就是从docker.io的大仓库中找到这个小仓库,找到小仓库后,我们需要找到标记哪个tag的镜像
docker pull docker.io/library/ubuntu:latest
1、在dockerhub上创建账号
2、创建小仓库(repository)

image-20210524145403273

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
只能创建一个私有仓库,公有仓库意味着创建的仓库都会被别人看到并拉取,这里指的仓库是repository

3、修改镜像的tag
[root@docker ~]# docker tag ubuntu:latest vorabend/zy:ubuntu-latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f643c72bc252 3 months ago 72.9MB
vorabend/zy ubuntu-latest f643c72bc252 3 months ago 72.9MB

4、登录dockerhub账户
[root@docker ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: vorabend
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

5、上传镜像到自己的dockerhub上
[root@docker ~]# docker push vorabend/zy:ubuntu-latest
The push refers to repository [docker.io/vorabend/zy]
f6253634dc78: Layer already exists
9069f84dbbe9: Layer already exists
bacd3af13903: Layer already exists
ubuntu-latest: digest: sha256:4e4bc990609ed865e07afc8427c30ffdddca5153fd4e82c20d8f0783a291e241 size: 943

6、Docker容器

1、Docker容器的介绍

镜像是静态的,将镜像运行起来就是容器,所以容器是动态的,镜像只会占用硬盘,但是容器会占用cou,内存和网络。
镜像的英文:image
容器的英文:container

注意:不能将容器看做成一个操作系统,因为容器不包含内核,没有内核的东西当然不能称为操作系统。

2、一次性运行容器

1
2
3
4
5
6
7
8
9
10
11
12
早期是用docker run ,后来改成了更加显著的命令格式docker container run
#运行第一个容器
[root@docker ~]# docker container run centos
#注意,没有指定tag,那就默认运行tag为latest的镜像
#这样整运行完毕就退出了

#第二种运行容器的方式
交互式运行容器
[root@docker ~]# docker run -i -t centos
[root@b087e607710f /]#
#-i表示交互的意思,-t是tty,表示为容器开放的一个终端

3、交互式运行容器

1
2
3
4
5
6
7
8
9
#-i表示交互的意思,-t是tty,表示为容器开放的一个终端
[root@docker ~]# docker run -i -t centos
[root@b087e607710f /]#

#我们通过pwd和ls命令查看到了,这个容器并没有/boot,容器不是操作系统,没有内核

#如果你是使用-i -t 参数以交互式的方式运行起来,你可以用ctrl+p+q临时的退出容器(容器没有被真正的关闭)
[root@docker ~]# docker attach ce2469f5c8aa
[root@ce2469f5c8aa /]#

7、高级操作

1、映射端口

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@docekr-ce ~]# docker pull nginx:1.12.2
[root@docekr-ce ~]# docker tag 4037a5562b03 vorabend/nginx:v1.12.2

#docker run -p 容器外端口:容器内端口
[root@docekr-ce ~]# docker run -it --rm --name nginx -p 8080:80 vorabend/nginx:v1.12.2
[root@docekr-ce ~]# netstat -tunpl | grep :8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 8053/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 8059/docker-proxy
[root@docekr-ce ~]# curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

2、挂载数据卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#docker run -v 容器外目录:容器内目录
[root@docekr-ce ~]# mkdir html
[root@docekr-ce ~]# cd html/
[root@docekr-ce html]# wget www.baidu.com -O index.html
[root@docekr-ce ~]# docker run -dt --rm --name nginx-disk -p 81:80 -v /root/html:/usr/share/nginx/html vorabend/nginx:v1.12.2
[root@docekr-ce ~]# netstat -tunpl | grep :81
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 8327/docker-proxy
tcp6 0 0 :::81 :::* LISTEN 8334/docker-proxy
[root@docekr-ce ~]# curl localhost:81
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

[root@docekr-ce ~]# docker inspect nginx-disk | grep share
"/root/html:/usr/share/nginx/html"
"Destination": "/usr/share/nginx/html",

3、传递环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
#docker run -e 环境变量的key=环境变量的value 需要多个变量加多个-e
[root@docekr-ce ~]# docker run --rm -e E_POTS=abcd vorabend/nginx:v1.12.2
[root@docekr-ce ~]# docker exec -it 8afeca24ef5b /bin/bash
root@8afeca24ef5b:/# echo $E_POTS
abcd

[root@docekr-ce ~]# docker run --rm -e E_POTS=abcd vorabend/nginx:v1.12.2 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b6e03656afe2
E_POTS=abcd
NGINX_VERSION=1.12.2-1~stretch
NJS_VERSION=1.12.2.0.1.14-1~stretch
HOME=/root

8、Dockerfile

1、Dockerfile规则

1
2
3
4
5
6
7
8
9
1、格式
#为注释
指令(大写)内容(小写)
尽管指令是大小写不敏感的,但是我们强烈建议指令用大写,内容用小写表示

2、Docker是按顺序执行Dockerfile里的指令集合的(从上至下依次执行)

3、每一个Dockerfile的第一个非注释行指令,必须是"FROM"指令,用于为镜像文件构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机(本地)上查找指定的镜像文件,当其在本地不存在时,则会从Docker registry(远端)上拉取所需的镜像文件。

2、USER/WORKDIR

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
[root@docekr-ce Dockerfile]# cat Dockerfile 
FROM docker.io/vorabend/nginx:curl
USER nginx
WORKDIR /usr/share/nginx/html

[root@docekr-ce Dockerfile]# docker build . -t docker.io/vorabend/nginx:curl_with_user_workdir
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM docker.io/vorabend/nginx:curl
---> ffa15a0bc447
Step 2/3 : USER nginx
---> Running in f51f7307d476
Removing intermediate container f51f7307d476
---> 227134b80d62
Step 3/3 : WORKDIR /usr/share/nginx/html
---> Running in a50fb1c01515
Removing intermediate container a50fb1c01515
---> 42d19e11387f
Successfully built 42d19e11387f
Successfully tagged vorabend/nginx:curl_with_user_workdir

[root@docekr-ce Dockerfile]# docker images | grep curl_with_user_workdir
vorabend/nginx curl_with_user_workdir 42d19e11387f About a minute ago 141MB

[root@docekr-ce Dockerfile]# docker run --rm -it --name nginx-test vorabend/nginx:curl_with_user_workdir /bin/bash
nginx@9161fdddc358:/usr/share/nginx/html$ whoami
nginx
nginx@9161fdddc358:/usr/share/nginx/html$ pwd
/usr/share/nginx/html

3、ADD/EXPOSE指令

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@docekr-ce Dockerfile]# cat Dockerfile 
FROM docker.io/vorabend/nginx:curl
ADD index.html /usr/share/nginx/html
EXPOSE 80

[root@docekr-ce Dockerfile]# tree
.
├── Dockerfile
└── index.html

[root@docekr-ce Dockerfile]# docker build . -t docker.io/vorabend/nginx:curl_with_add_expose
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM docker.io/vorabend/nginx:curl
---> ffa15a0bc447
Step 2/3 : ADD index.html /usr/share/nginx/html
---> bdaf4b5822eb
Step 3/3 : EXPOSE 80
---> Running in f6fecbc90c2c
Removing intermediate container f6fecbc90c2c
---> 3911ecd68c8d
Successfully built 3911ecd68c8d
Successfully tagged vorabend/nginx:curl_with_add_expose

#-P表示宿主机随机监听一个端口
[root@docekr-ce Dockerfile]# docker run --rm -it --name nginx-test -P vorabend/nginx:curl_with_add_expose /bin/bash
root@c0b0e0759837:/# nginx -g "daemon off;"

[root@docekr-ce ~]# netstat -tunpl | grep docker | grep 49156
tcp 0 0 0.0.0.0:49156 0.0.0.0:* LISTEN 14654/docker-proxy
tcp6 0 0 :::49156 :::* LISTEN 14661/docker-proxy

[root@docekr-ce ~]# curl localhost:49156
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

4、RUN/ENV

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@docekr-ce Dockerfile]# cat  Dockerfile 
FROM ubuntu
ENV VER nginx
RUN apt update -y && apt install $VER -y

[root@docekr-ce Dockerfile]# docker build . -t docker.io/vorabend/ubuntu:with_nginx

[root@docekr-ce Dockerfile]# docker images | grep with_nginx
vorabend/ubuntu with_nginx 584510dc7759 About a minute ago 167MB

[root@docekr-ce Dockerfile]# docker run --rm -it --name ubuntu-test vorabend/ubuntu:with_nginx
root@16646bad2278:/# which nginx
/usr/sbin/nginx

5、CMD/ENTRYPOINT指令

1、CMD指令

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
#cmd里面的内容是当容器运行时命令行被执行的命令
[root@docekr-ce Dockerfile]# cat Dockerfile
FROM centos:7
ENV VER httpd
RUN yum update -y && yum install $VER -y
CMD ["httpd","-D","FOREGROUND"]

[root@docekr-ce Dockerfile]# docker build . -t vorabend/centos:centos_httpd_CMD

[root@docekr-ce Dockerfile]# docker images | grep centos_httpd_CMD
vorabend/centos centos_httpd_CMD 31f3dadaf231 54 seconds ago 538MB

[root@docekr-ce Dockerfile]# docker run -d --rm --name centos-httpd -p83:80 vorabend/centos:centos_httpd_CMD
4d698e58fe331f7dea4104338016063b2f250ce47399540c2e9be59d5f9b1d4b

[root@docekr-ce Dockerfile]# docker ps -a | grep centos_httpd_CMD -B1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d698e58fe33 vorabend/centos:centos_httpd_CMD "httpd -D FOREGROUND" 59 seconds ago Up 58 seconds

[root@docekr-ce Dockerfile]# netstat -tunpl | grep :83
tcp 0 0 0.0.0.0:83 0.0.0.0:* LISTEN 22694/docker-proxy
tcp6 0 0 :::83 :::* LISTEN 22701/docker-proxy

[root@docekr-ce Dockerfile]# curl localhost:83
[root@docekr-ce Dockerfile]# echo $?
0

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
25
26
27
28
29
30
#实行shell脚本执行的命令,其实可以用CMD代替,但是CMD可以被替换掉
[root@docekr-ce Dockerfile]# cat entrypoint.sh
#!/bin/bash
/sbin/nginx -g "daemon off;"

[root@docekr-ce Dockerfile]# chmod u+x entrypoint.sh

[root@docekr-ce Dockerfile]# cat Dockerfile
FROM centos:7
ADD entrypoint.sh /entrypoint.sh
ENV VER nginx
RUN yum update -y && yum install epel-release -y && yum install $VER -y
ENTRYPOINT /entrypoint.sh

[root@docekr-ce Dockerfile]# docker build . -t vorabend/centos:nginx_entrypoint

[root@docekr-ce Dockerfile]# docker images | grep nginx_entrypoint
vorabend/centos nginx_entrypoint f7478860101d 25 seconds ago 575MB

[root@docekr-ce Dockerfile]# docker run --rm -d --name nginx_entrypoint -p888:80 vorabend/centos:nginx_entrypoint
870bd36cd5a1b4b20cd8af8077fca7b4e04cf3d4d088832fa853ec94d87c0f97

[root@docekr-ce Dockerfile]# curl localhost:888
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

6、综合实验

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
[root@docekr-ce Dockerfile]# cat Dockerfile 
FROM nginx:1.12.2
USER root
ENV WWW /usr/share/nginx/html
ENV CONF /etc/nginx/conf.d
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
WORKDIR $WWW
ADD index.html $WWW/index.html
ADD demo.od.com.conf $CONF/demo.od.com.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

[root@docekr-ce Dockerfile]# cat demo.od.com.conf
server {
listen 80;
server_name demo.od.com;
root /usr/share/nginx/html;
}

[root@docekr-ce Dockerfile]# docker build . -t vorabend/nginx:all_test
[root@docekr-ce Dockerfile]# docker images | grep all_test
vorabend/nginx all_test da35eb97f64e 28 seconds ago 108MB

[root@docekr-ce Dockerfile]# docker run -d --rm --name all_test -P vorabend/nginx:all_test
cc7d7ea870c063587bb8fba1fae2fa8c2694346d501aafc288ddd23b2b41a6d9
[root@docekr-ce Dockerfile]# docker ps -a | grep all_test
cc7d7ea870c0 vorabend/nginx:all_test "nginx -g 'daemon of…" 33 seconds ago Up 31 seconds 0.0.0.0:49161->80/tcp, :::49161->80/tcp all_test

[root@docekr-ce Dockerfile]# curl localhost:49161
[root@docekr-ce Dockerfile]# echo $?
0

9、Docker的网络模型

1、NAT(默认)

2、None

3、HOST

4、联合网络

1
2
3
4
5
6
[root@docekr-ce Dockerfile]# docker run -dt --name lianhewangluo1 centos:latest 
1d3a164e3d61455beb7f76974e10b6f12fb1d2679f39d1d14e4ec3b8f9a276f0

[root@docekr-ce Dockerfile]# docker run -dt --name lianhewangluo2 --network container:1d3a164e3d61 centos:latest

#进入两个容器发现其IP地址都是一样的,共享了网络名称空间

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!