【Linux运维大神系列】docker详解(四)

目录

docker容器的四种状态

查看容器的进程的三种方式

基于centos环境手动制作docker镜像

1)导入镜像

2)启动centos镜像

3)查看容器和镜像的大小

4)开始安装服务

4.1配置nginx官方源

4.2配置yum源并安装nginx服务

5)再次查看容器大小

6)做一些yum的优化策略

7)准备Nginx的测试数据

7.1删除源文件内容

7.2拷贝游戏代码

7.3测试是否成功

8)提交镜像

8.1将c1容器提交为镜像

8.2查看镜像

9)启动自定义的镜像

9.1不指定自定义命令启动

9.2带启动命令的方式启动容器

9.3将新的启动镜像再提交一次

基于ubuntu制作游戏镜像

1)导入镜像

2)启动镜像

3)安装服务

4)拷贝测试代码

5)提交镜像

6)启动镜像

7)再次提交

使用alpine镜像制作游戏镜像

1)导入镜像

2)启动容器并安装服务

3)修改nginx配置

4)检查配置文件语法

5)提交镜像

6)启动容器

7)再次提交

8)查看镜像大小

手动制作镜像缺点

基于Dockerfile自动制作镜像

1)什么是Dockerfile

2)基于Dockerfile制作镜像的流程

3)常用的dockerfile指令

4)基于Dockerfile制作游戏镜像案例

4.1进入到工作目录

4.2打包文件

4.3准备配置文件

4.4编写dockerfile

4.5打镜像

5)基于镜像启动服务

docker容器的四种状态

bash 复制代码
-Up:
    代表的是容器处于运行状态。

-Exited:
    表示容器的启动名称被终止,通常情况下,退出状态码为0则容器正常退出,非0表示异常退出。

    案例:
    root@docker101:~# docker run -d --name c1 jasonyin2020/oldboyedu-linux-tools:v0.1                                                                 sleep 10
    06ccf49a8cfc13d0ce2952b92846edf01314b64bfd7755879db8190d34353b03

    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                     COMMAND      CREATED             STATUS        PORTS     NAMES
    06ccf49a8cfc   jasonyin2020/oldboyedu-linux-tools:v0.1   "sleep 10"   2 seconds ago       Up 1 second             c1

    root@docker101:~# docker ps -l # 观察退出的状态码为0
    CONTAINER ID   IMAGE                                     COMMAND      CREATED              STATUS                              PORTS     NAMES
    06ccf49a8cfc   jasonyin2020/oldboyedu-linux-tools:v0.1   "sleep 10"   11 seconds ago       Exited (0) Less than a second ago             c1

    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                     COMMAND        CREATED             STATUS        PORTS     NAMES
    11cd4fb3464e   jasonyin2020/oldboyedu-linux-tools:v0.1   "sleep 3600"   2 seconds     ago   Up 1 second             c2

    root@docker101:~# docker inspect  -f "{{.State.Pid}}" c2
    3006

    root@docker101:~# kill -9 3006  # 观察退出的状态码为非0

    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                     COMMAND        CREATED              STATUS                      PORTS     NAMES
    11cd4fb3464e   jasonyin2020/oldboyedu-linux-tools:v0.1   "sleep 3600"   45 seconds     ago   Exited (137) 1 second ago             c2

-Created:
    表示容器处于创建状态,但是没有启动,需要执行"docker start"命令启动该容器,所以"docker run"等于"docker create + docker start"。

    案例:
    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                     COMMAND        CREATED             STATUS    PORTS     NAMES
    42ab49570891   jasonyin2020/oldboyedu-linux-tools:v0.1   "sleep 3600"   3 seconds     ago   Created             c3
    root@docker101:~# 
    root@docker101:~# docker start c3
    c3
    root@docker101:~# 
    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                     COMMAND        CREATED                      STATUS        PORTS     NAMES
    42ab49570891   jasonyin2020/oldboyedu-linux-tools:v0.1   "sleep 3600"   About a     minute ago   Up 1 second             c3
    
-Paused:
    容器依旧处于运行状态,但是此状态暂停对外服务。(类似于虚拟机被挂起)
    重启容器,会对状态的时间重新计时,但暂停后在停止暂停不会

    案例:
    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                                       COMMAND                      CREATED          STATUS          PORTS                               NAMES
    63692ba3efe0   registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1   "/docker-    entrypoint...."   28 seconds ago   Up 27 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   c4

    root@docker101:~# docker container pause c4 
    c4

    root@docker101:~# docker ps -l  # 注意观察,容器处于Paused状态,不对外提供服务。
    CONTAINER ID   IMAGE                                                       COMMAND                      CREATED          STATUS                   PORTS                               NAMES
    63692ba3efe0   registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1   "/docker-        entrypoint...."   45 seconds ago   Up 44 seconds (Paused)   0.0.0.0:80->80/tcp, :::80-        >80/tcp   c4

    root@docker101:~# docker container unpause c4 
    c4

    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                                       COMMAND                      CREATED         STATUS         PORTS                               NAMES
    63692ba3efe0   registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1   "/docker-    entrypoint...."   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   c4

    root@docker101:~# docker restart c4  # 重启容器,会对状态的时间重新计时,但暂停不会。
    c4

    root@docker101:~# docker ps -l
    CONTAINER ID   IMAGE                                                       COMMAND                      CREATED         STATUS        PORTS                               NAMES
    63692ba3efe0   registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1   "/docker-    entrypoint...."   3 minutes ago   Up 1 second   0.0.0.0:80->80/tcp, :::80->80/tcp   c4
    

查看容器的进程的三种方式

bash 复制代码
    1.在宿主机直接过滤【弊端就是多实例的时候不太好区分具体的容器】
ps -ef | grep 进程名称相关信息
案例:
[root@docker101 ~]#ps -ef | grep nginx
root      27977      1  0 Dec19 ?        00:00:20 runsvdir -P /opt/gitlab/service log: es. svlogd: warning: unable to lock directory: /var/log/gitlab/nginx: temporary failure svlogd: fatal: no functional log directories. svlogd: warning: unable to lock directory: /var/log/gitlab/nginx: temporary failure svlogd: fatal: no functional log directories. svlogd: warning: unable to lock directory: /var/log/gitlab/nginx: temporary failure svlogd: fatal: no functional log directories. .
root      28010      1  0 Dec19 ?        00:00:00 nginx: master process /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx
gitlab-+  28078  28010  0 Dec19 ?        00:00:00 nginx: worker process
gitlab-+  28079  28010  0 Dec19 ?        00:00:03 nginx: worker process
gitlab-+  28080  28010  0 Dec19 ?        00:00:01 nginx: cache manager process
root      49498  27977  0 Dec20 ?        00:01:17 runsv nginx
root     103604 103585  0 14:14 ?        00:00:00 nginx: master process nginx -g daemon off;

 
    2.使用docker inspect查看容器的详细信息
docker inspect -f "{{.State.PID}}"  容器ID
案例:
[root@docker101 ~]#docker inspect -f "{{.State.Pid}}" 138889c4b6e1
103604

    3.使用top查看容器的进程ID
docker top 容器ID
案例:
[root@docker101 ~]#docker top c1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                103604              103585              0                   14:14               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 103650              103604              0                   14:14               ?                   00:00:00            nginx: worker process
101                 103651              103604              0                   14:14               ?                   00:00:00            nginx: worker process

基于centos环境手动制作docker镜像

镜像下载地址:

1)导入镜像

bash 复制代码
[root@docker101 ~]#docker load -i centos.tar.gz 
174f56854903: Loading layer [==================================================>]  211.7MB/211.7MB
Loaded image: centos:centos7.9.2009

2)启动centos镜像

bash 复制代码
[root@docker101 ~]#docker run -it --name c1 centos:centos7.9.2009 
[root@d138e6707b0a /]# 

3)查看容器和镜像的大小

bash 复制代码
[root@docker101 /]#docker image ls centos
REPOSITORY   TAG              IMAGE ID       CREATED       SIZE
centos       centos7.9.2009   eeb6ee3f44bd   4 years ago   204MB

[root@docker101 /]#docker ps -ls
CONTAINER ID   IMAGE                   COMMAND       CREATED              STATUS              PORTS     NAMES     SIZE
d138e6707b0a   centos:centos7.9.2009   "/bin/bash"   About a minute ago   Up About a minute             c1        0B (virtual 204MB)

4)开始安装服务

4.1配置nginx官方源

bash 复制代码
[root@d138e6707b0a /]# cat >/etc/yum.repos.d/nginx.repo<<'EOF'
> [nginx-stable]
> name=nginx stable repo
> baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
> gpgcheck=1
> enabled=1
> gpgkey=https://nginx.org/keys/nginx_signing.key
> module_hotfixes=true
> 
> [nginx-mainline]
> name=nginx mainline repo
> baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/
> gpgcheck=1
> enabled=0
> gpgkey=https://nginx.org/keys/nginx_signing.key
> module_hotfixes=true
> EOF


[root@d138e6707b0a /]# cat /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

4.2配置yum源并安装nginx服务

bash 复制代码
[root@d138e6707b0a /]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@d138e6707b0a /]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

[root@d138e6707b0a /]# yum -y install nginx

5)再次查看容器大小

bash 复制代码
[root@docker101 /]#docker ps -ls
CONTAINER ID   IMAGE                   COMMAND       CREATED          STATUS          PORTS     NAMES     SIZE
d138e6707b0a   centos:centos7.9.2009   "/bin/bash"   15 minutes ago   Up 15 minutes             c1        265MB (virtual 469MB)

6)做一些yum的优化策略

bash 复制代码
[root@d138e6707b0a /]# du -sh /var/cache/yum    #查看yum缓存大小
222M	/var/cache/yum
[root@d138e6707b0a /]# rm -rf /var/cache/yum    #删除yum缓存
[root@d138e6707b0a /]# nginx -t                 #nginx服务正常
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

再次查看容器大小(小了很多)
[root@docker101 /]#docker ps -ls
CONTAINER ID   IMAGE                   COMMAND       CREATED          STATUS          PORTS     NAMES     SIZE
d138e6707b0a   centos:centos7.9.2009   "/bin/bash"   20 minutes ago   Up 20 minutes             c1        32.2MB (virtual 236MB)

7)准备Nginx的测试数据

7.1删除源文件内容

bash 复制代码
[root@d138e6707b0a /]# rm -rf  /usr/share/nginx/html/*

[root@d138e6707b0a /]# ls -l /usr/share/nginx/html  
total 0

7.2拷贝游戏代码

bash 复制代码
[root@docker101 /]#ll bird/
total 140
-rw-r--r-- 1 root root 15329 Aug 31  2022 2000.png
-rw-r--r-- 1 root root 51562 Aug 31  2022 21.js
-rw-r--r-- 1 root root   254 Aug 31  2022 icon.png
drwxr-xr-x 2 root root   102 Feb 23  2023 img
-rw-r--r-- 1 root root  3049 Aug 31  2022 index.html
-rw-r--r-- 1 root root 63008 Aug 31  2022 sound1.mp3

#拷贝进centos容器
[root@docker101 /]#docker cp ./bird c1:/usr/share/nginx/html/
Successfully copied 172kB to c1:/usr/share/nginx/html/

#进入容器,将文件移出来
[root@d138e6707b0a html]# ll
total 0
drwxr-xr-x 3 root root 98 Feb 23  2023 bird
[root@d138e6707b0a html]# mv bird/* ./
[root@d138e6707b0a html]# rm -rf bird/
[root@d138e6707b0a html]# ll
total 140
-rw-r--r-- 1 root root 15329 Aug 31  2022 2000.png
-rw-r--r-- 1 root root 51562 Aug 31  2022 21.js
-rw-r--r-- 1 root root   254 Aug 31  2022 icon.png
drwxr-xr-x 2 root root   102 Feb 23  2023 img
-rw-r--r-- 1 root root  3049 Aug 31  2022 index.html
-rw-r--r-- 1 root root 63008 Aug 31  2022 sound1.mp3

#前台启动nginx
[root@d138e6707b0a html]# nginx -g 'daemon off;'

7.3测试是否成功

bash 复制代码
[root@docker101 /]#docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}" `docker container ps -q`
172.17.0.2 
[root@docker101 /]#curl 172.17.0.2
<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta id="viewport" name="viewport" content="width=device-width,user-scalable=no" />
		<script type="text/javascript" src="21.js"></script>
        <title>小鸟飞飞飞-文章库小游戏</title>
...

8)提交镜像

8.1将c1容器提交为镜像

bash 复制代码
[root@docker101 /]#docker container commit c1 joren-bird:v0.1
sha256:bff260b2ca683e6cd9e3405716518dfadda604a9664075490b919667b91da40c
[root@docker101 /]#

8.2查看镜像

bash 复制代码
[root@docker101 /]#docker image ls joren-bird
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
joren-bird   v0.1      bff260b2ca68   42 seconds ago   236MB

9)启动自定义的镜像

9.1不指定自定义命令启动

bash 复制代码
[root@docker101 /]#docker run -itd -p 88:80 --name game joren-bird:v0.1 
c61d5e4ee930cac3e2e306c5409bba92b643f0de3ec5a1c413576271ca0d1c83
[root@docker101 /]#docker ps
CONTAINER ID   IMAGE             COMMAND       CREATED         STATUS         PORTS                               NAMES
c61d5e4ee930   joren-bird:v0.1   "/bin/bash"   4 seconds ago   Up 3 seconds   0.0.0.0:88->80/tcp, :::88->80/tcp   game

[root@docker101 /]#docker top game
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                112879              112858              0                   15:22               pts/0               00:00:00            /bin/bash
[root@docker101 /]#docker exec -it game sh
sh-4.2# nginx
sh-4.2# 

注意:
    这种方式需要手动启动,不建议

9.2带启动命令的方式启动容器

bash 复制代码
[root@docker101 /]#docker run -itd -p 88:80 --name game joren-bird:v0.1 nginx -g 'daemon off;'
6f6beb16c64c01c283e59ba9a206a7f46c5181f5b84b7c9eb41b9860aac715e8

[root@docker101 /]#docker top game
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                114365              114343              0                   15:31               pts/0               00:00:00            nginx: master process nginx -g daemon off;
polkitd             114383              114365              0                   15:31               pts/0               00:00:00            nginx: worker process
polkitd             114384              114365              0                   15:31               pts/0               00:00:00            nginx: worker process

注意:
    这种方式可以不需要手动启动,但是还需要输入命令,不建议

9.3将新的启动镜像再提交一次

bash 复制代码
[root@docker101 /]#docker run -itd --name game -p 88:80 joren-bird:v0.2
975db04e165cf8470d6d4d9d98ec184a67ffd0a7d6e48fb67e3552df5d9beefd

[root@docker101 /]#docker top game 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                114978              114956              0                   15:34               pts/0               00:00:00            nginx: master process nginx -g daemon off;
polkitd             114997              114978              0                   15:34               pts/0               00:00:00            nginx: worker process
polkitd             114998              114978              0                   15:34               pts/0               00:00:00            nginx: worker process

[root@docker101 /]#docker ps -l --no-trunc
CONTAINER ID                                                       IMAGE             COMMAND                    CREATED              STATUS              PORTS                               NAMES
975db04e165cf8470d6d4d9d98ec184a67ffd0a7d6e48fb67e3552df5d9beefd   joren-bird:v0.2   "nginx -g 'daemon off;'"   About a minute ago   Up About a minute   0.0.0.0:88->80/tcp, :::88->80/tcp   game

注意:
     1.本案例中"joren-bird:v0.1"是"joren-bird:v0.2"的父镜像;
     2.如果启动子镜像时没有指定COMMAND(容器的启动命令),则使用父镜像的启动命令;

基于ubuntu制作游戏镜像

1)导入镜像

bash 复制代码
[root@docker101 /]#docker load -i ubuntu.tar.gz 
931b7ff0cb6f: Loading layer [==================================================>]  80.41MB/80.41MB
Loaded image: ubuntu:22.04

2)启动镜像

bash 复制代码
[root@docker101 /]#docker run --name c1 -it ubuntu:22.04 
root@2cd135807400:/# 

3)安装服务

bash 复制代码
root@2cd135807400:/# apt update

root@2cd135807400:/# apt -y install nginx

4)拷贝测试代码

bash 复制代码
#删除源文件
root@2cd135807400:/etc/nginx# rm -rf /var/www/html/*

#拷贝游戏代码
[root@docker101 ~]#docker cp /bird c1:/var/www/html/
Successfully copied 172kB to c1:/var/www/html/

#移出代码
root@2cd135807400:/var/www/html# ls
bird
root@2cd135807400:/var/www/html# mv bird/* ./
root@2cd135807400:/var/www/html# rm -rf bird/
root@2cd135807400:/var/www/html# ll
total 140
drwxr-xr-x 3 root root    98 Dec 21 08:04 ./
drwxr-xr-x 3 root root    18 Dec 21 07:55 ../
-rw-r--r-- 1 root root 15329 Aug 31  2022 2000.png
-rw-r--r-- 1 root root 51562 Aug 31  2022 21.js
-rw-r--r-- 1 root root   254 Aug 31  2022 icon.png
drwxr-xr-x 2 root root   102 Feb 23  2023 img/
-rw-r--r-- 1 root root  3049 Aug 31  2022 index.html
-rw-r--r-- 1 root root 63008 Aug 31  2022 sound1.mp3

5)提交镜像

bash 复制代码
[root@docker101 ~]#docker commit c1 ubuntu-bird:v0.1
sha256:1348efdaf279c89808de874c58af34b433beff6a2b0b75a0d13e1825091ce6e4

6)启动镜像

bash 复制代码
[root@docker101 ~]#docker run -d --name c1 -p 88:80 ubuntu-bird:v0.1 nginx -g 'daemon off;' 
5cfd57cb9855dee7c76a3cf8d2bcfdf9cb2b1d5a50476ce6dc3a66eaf3633aaf

7)再次提交

bash 复制代码
[root@docker101 ~]#docker commit c1 ubuntu-bird:v0.2
sha256:0efa9be001ccb834e27fe7fc71ed3893b8bd6b6e3490c5658d695448448536ff
[root@docker101 ~]#docker container rm -f `docker ps -qa`
5cfd57cb9855
[root@docker101 ~]#docker run -d --name c1 -p 88:80 ubuntu-bird:v0.2
689d13ec287469e8578eb333b1acf62b9192ee9a137948df618e748fcc478f2d
[root@docker101 ~]#docker top c1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                120733              120714              0                   16:08               ?                   00:00:00            nginx: master process nginx -g daemon off;
33                  120751              120733              0                   16:08               ?                   00:00:00            nginx: worker process
33                  120752              120733              0                   16:08               ?                   00:00:00            nginx: worker process

使用alpine镜像制作游戏镜像

1)导入镜像

bash 复制代码
[root@docker101 ~]#docker load -i alpine.tar.gz 
78561cef0761: Loading layer  8.082MB/8.082MB
Loaded image: alpine:3.20.2

2)启动容器并安装服务

bash 复制代码
[root@docker101 ~]#docker run -it --name c1 alpine:3.20.2 
/ # 
/ # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories    #换成国内镜像源
/ # apk update
fetch https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community/x86_64/APKINDEX.tar.gz
v3.20.8-102-gad44703098d [https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main]
v3.20.8-101-g50fadd0097b [https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community]
OK: 24180 distinct packages available
/ # apk add nginx    #安装服务
(1/2) Installing pcre (8.45-r3)
(2/2) Installing nginx (1.26.3-r0)
Executing nginx-1.26.3-r0.pre-install
Executing nginx-1.26.3-r0.post-install
Executing busybox-1.36.1-r29.trigger
OK: 9 MiB in 16 packages    
/ # du -sh /var/cache/apk/
2.2M	/var/cache/apk/
/ # rm -rf /var/cache/apk/    #删除apk缓存

3)修改nginx配置

bash 复制代码
/ # rm -rf /etc/nginx/http.d/default.conf     #删除原配置文件
/ # vi /etc/nginx/http.d/default.conf        #重写一个
server { 
        listen 80;
        location / { 
                root /usr/share/nginx/html;
                index index.html;
        }
}
/ # rm -rf /usr/share/nginx/*    #删除原文件

[root@docker101 /]#docker cp /bird c1:/usr/share/nginx/html    #拷贝代码
Successfully copied 172kB to c1:/usr/share/nginx/html

4)检查配置文件语法

bash 复制代码
/ # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

5)提交镜像

bash 复制代码
[root@docker101 /]#docker commit c1 joren-bird:v1.0
sha256:c3a4a30c80ad487bc818f7b271b1b17a7f50f3d613946534d0c89f08bfa19e17

6)启动容器

bash 复制代码
[root@docker101 /]#docker run -d --name c1 -p 88:80 joren-bird:v1.0 nginx -g 'daemon off;'
ec7e8bb0128b281a72c6c53d0788f5dfc2ba0f0792223e0324a3ecdd07a299c5

7)再次提交

bash 复制代码
[root@docker101 /]#docker commit c1 joren-bird:v1.1
sha256:c26012af7f7d02038de549d5727d1c84db78a75dbed010dfec1b9a1770d414eb

[root@docker101 /]#docker run -d --name c1 -p 88:80 joren-bird:v1.1 
c6b0e29cc1a6795a994af34b54da81c9c311f06569c3f0b24781f420839631d1
[root@docker101 /]#docker top c1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                124206              124186              0                   16:30               ?                   00:00:00            nginx: master process nginx -g daemon off;
100                 124229              124206              0                   16:30               ?                   00:00:00            nginx: worker process
100                 124230              124206              0                   16:30               ?                   00:00:00            nginx: worker process

8)查看镜像大小

bash 复制代码
[root@docker101 /]#docker image ls joren-bird
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
joren-bird   v1.1      c26012af7f7d   About a minute ago   9.41MB    #alpine镜像大小
joren-bird   v1.0      c3a4a30c80ad   3 minutes ago        9.41MB
joren-bird   v0.2      62c92bb497d3   57 minutes ago       236MB    #centos镜像大小
joren-bird   v0.1      bff260b2ca68   About an hour ago    236MB

[root@docker101 /]#docker image ls ubuntu-bird
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
ubuntu-bird   v0.2      0efa9be001cc   24 minutes ago   205MB    #ubuntu镜像大小
ubuntu-bird   v0.1      1348efdaf279   26 minutes ago   205MB

手动制作镜像缺点

1.镜像的体积过大,不易传输

2.镜像的修改复杂,比如修改COMMAND启动命令,需要先启动容器,再提交一个新的镜像,基于新的镜像启动

3.无法利用缓存技术,需要手动逐条执行命令,和Linux虚拟机的操作类似

基于Dockerfile自动制作镜像

1)什么是Dockerfile

所谓的dockerfile本质就是一个制作镜像的流程。

2)基于Dockerfile制作镜像的流程

1.手动制作镜像的命令记录下来

2.基于dockerfile相关的指定进行改写

3)常用的dockerfile指令

``FROM

``RUN

``CMD

``ENTRYPOINT

``ENV

``ARG

``VOLUME

``EXPOSE

``MAINTAINER

``LABEL

``COPY

``ADD

``HELTHCHEACK

``ONBUILD

``SHELL

``USER

``...

4)基于Dockerfile制作游戏镜像案例

4.1进入到工作目录

bash 复制代码
root@docker101 /]#mkdir -pv /joren/dockerfile
mkdir: created directory '/joren/dockerfile'
[root@docker101 /]#cd /joren/dockerfile/
[root@docker101 /joren/dockerfile]#
[root@docker101 /joren/dockerfile]#mkdir alpine centos ubuntu
[root@docker101 /joren/dockerfile]#ll
total 0
drwxr-xr-x 2 root root 6 Dec 21 16:43 alpine
drwxr-xr-x 2 root root 6 Dec 21 16:43 centos
drwxr-xr-x 2 root root 6 Dec 21 16:43 ubuntu

4.2打包文件

bash 复制代码
[root@docker101 /bird]#tar zcvf bird.tar.gz * 
2000.png
21.js
icon.png
img/
img/bg1.jpg
img/bg2.jpg
img/number1.png
img/number2.png
img/s1.png
img/s2.png
index.html
sound1.mp3
[root@docker101 ~]#mv bird.tar.gz /joren/dockerfile/alpine/bird/
[root@docker101 ~]#ll /joren/dockerfile/alpine/bird/
total 96
-rw-r--r-- 1 root root 91576 Dec 21 17:09 bird.tar.gz
-rw-r--r-- 1 root root   339 Dec 21 16:52 Dockerfile

4.3准备配置文件

bash 复制代码
[root@docker101 /joren/dockerfile/alpine/bird]#vim bird.conf
server {
    listen 80;
    location / {
       root /usr/share/nginx/html;
       index index.html;
    }
}

4.4编写dockerfile

bash 复制代码
[root@docker101 /joren/dockerfile]#cd alpine/
[root@docker101 /joren/dockerfile/alpine]#mkdir bird && cd bird
[root@docker101 /joren/dockerfile/alpine/bird]#
[root@docker101 /joren/dockerfile/alpine/bird]#vim Dockerfile
#指定基础镜像,后续的所有操作都在该镜像基础之上操作
FROM alpine:3.20.2

#在容器中运行命令,安装nginx服务
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
     apk update && \
     apk add nginx && \
     rm -rf /var/cache/apk/ rm -f /usr/share/nginx/*

#将本地配置文件覆盖容器的原配置文件
COPY bird.conf /etc/nginx/http.d/default.conf

#将当前目录下的"bird.tar.gz"复制到容器的根目录下
COPY bird.tar.gz /

#容器解压到指定目录
RUN mkdir -pv /usr/share/nginx/html  && \
    tar xf /bird.tar.gz -C /usr/share/nginx/html && \
    rm -f /bird.tar.gz

#指定容器的启动命令
CMD ["nginx","-g","daemon off;"]

4.5打镜像

bash 复制代码
[root@docker101 /joren/dockerfile/alpine/bird]#docker build -t joren-bird:v1.2 .    #因为文件在当前目录,所以使用 '.'。

5)基于镜像启动服务

bash 复制代码
[root@docker101 /joren/dockerfile/alpine/bird]#docker run -d -p 88:80 --name game joren-bird:v1.2
ae381a98a5b6de23f3f5604083fa3a031210416992269fc4bfb5ff642fba25c0
[root@docker101 /joren/dockerfile/alpine/bird]#docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                               NAMES
ae381a98a5b6   joren-bird:v1.2   "nginx -g 'daemon of..."   4 seconds ago   Up 3 seconds   0.0.0.0:88->80/tcp, :::88->80/tcp   game
[root@docker101 /joren/dockerfile/alpine/bird]#docker top game 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2654                2633                0                   17:29               ?                   00:00:00            nginx: master process nginx -g daemon off;
100                 2672                2654                0                   17:29               ?                   00:00:00            nginx: worker process
100                 2673                2654                0                   17:29               ?                   00:00:00            nginx: worker process

注意:建议使用tar包打包文件,使用zip可能会出现压缩损坏文件的情况,尤其是图片类型文件;

相关推荐
老王熬夜敲代码2 小时前
网络中数据传输的具体过程
linux·网络·笔记
Elastic 中国社区官方博客3 小时前
让我们把这个 expense 工具从 n8n 迁移到 Elastic One Workflow
大数据·运维·elasticsearch·搜索引擎·ai·信息可视化·全文检索
世转神风-3 小时前
linux使用终端打开当前文件夹界面
linux
( •̀∀•́ )9204 小时前
GitHub Actions SSH 部署密钥
运维·ssh·github
louqle4 小时前
docker基本知识及常用命令汇总
运维·docker·容器
刘某的Cloud4 小时前
列表、元组、字典、集合-组合数据类型
linux·开发语言·python
学烹饪的小胡桃4 小时前
【运维学习】实时性能监控工具 WGCLOUD v3.6.2 更新介绍
linux·运维·服务器·学习·工单系统
知识分享小能手4 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04的桌面环境 (4)
linux·学习·ubuntu
叫致寒吧4 小时前
Docker
运维·docker·容器