Docker基础管理和镜像制作

目录

docker执行规则        有前台的进程才能进去页面

下载镜像存在位置

操作系统的镜像是不运行的需要有前台才能进行 列:

清除dangling的镜像,dangling images表示TAG为的镜像

默认清除dangling以及不再使用的镜像

镜像打标签

查看容器相关命令  docker container  就能查看

启动容器 docker run拉去打开     create拉去

删除容器

images 列出本地镜像

docker rmi : 删除本地一个或多个镜像  -f强制  在运行强制删也没用

docker ps : 列出容器

从容器内退出

 定义别名

root权限问题--privileged 选项  尽量别用

运行docker官方文档容器

显示当前存在容器

查看容器内的进程 

查看容器资源使用情况 

 查看容器的详细信息 inspect

容器的启动和停止

给正在运行的容器发信号  docker kill

进入正在运行的容器   双页面同步

使用exec命令

 暴露所有容器端口  -P -p

查看容器的日志  docker logs nginx01

传递运行命令

容器内部的hosts文件

指定容器DNS

容器内和宿主机之间复制文件 cp  文件夹也可以

  容器参数设置如密码之类 这个需要先去相关官网看看支持不支持

传递环境变量

 清除不再使用的数据

利用 Docker 快速部署自动化运维平台

 初始化

​编辑 Docker 镜像制作和管理

制作镜像方式

利用 DockerFile 文件执行 docker build 自动构建镜像

Dockerfile 镜像制作和使用流程

Dockerfile文件的制作镜像的分层结构 

1. FROM: 指定基础镜像

关于scratch 镜像              所有镜像的祖宗最小镜像

2. LABEL: 指定镜像元数据 可以指定镜像元数据,如: 镜像作者等

3. RUN: 执行 shell命令

 ENV: 设置环境变量

COPY: 复制文本

 ADD: 复制和解包文件

 CMD: 容器启动命令

​编辑

ENTRYPOINT: 入口点


docker执行规则        有前台的进程才能进去页面

操作系统的镜像,如果没有前台进程,此容器自动退出,非守护进程的容器

应用级的镜像,比如,nginx, 有前台进程,正常运行,守护进程的容器

下载镜像存在位置

ls /var/lib/docker/image/overlay2/

操作系统的镜像是不运行的需要有前台才能进行 列:

让容器持续运行

 

 没有运行时

 运行时 

 

运行时进去操作

 

 退出进程

 

清除dangling的镜像,dangling images表示TAG为<none>的镜像

docker image prune

默认清除dangling以及不再使用的镜像

docker image prune -a -f

镜像打标签

docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定仓库     格式

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
#TARGET_IMAGE[:TAG]格式一般形式     上传规格   
仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本

Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
[root@ubuntu2004 ~]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    beae173ccac6   9 months ago    1.24MB
rockylinux   latest    210996f98b85   10 months ago   205MB
[root@ubuntu2004 ~]#docker tag busybox  rockylinux:v1.0
[root@ubuntu2004 ~]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    beae173ccac6   9 months ago    1.24MB
rockylinux   v1.0      beae173ccac6   9 months ago    1.24MB
rockylinux   latest    210996f98b85   10 months ago   205MB

查看容器相关命令  docker container  就能查看

启动容器 docker run拉去打开     create拉去

#选项:
-i, --interactive Keep STDIN open even if not attached,通常和-t一起使用
-t, --tty 分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进入
-d, --detach Run container in background and print container ID,台后运行,默认前台

 --name string       为容器分配一个名称

--rm     当容器退出时自动删除它

--restart 可以指定四种不同的policy

no      默认为no推出就退出,不做干扰
on-failure[:max-retries]   因为特殊原因退出,则自动重启  非o
always  开机自启且退出立马起来
unless-stopped   除了不能开机自启,其余的和上面always一样

docker run 可以启动容器,进入到容器,并随机生成容器ID和名称

docker run nginx:1.22.0     #nginx是前台运行跑起来之后会卡在页面不退出

docker run -d nginx:1.22.0   #前台变后台运行

docker run = docker create + docker start  #意思

docker run -it rockylinux bash  #交互式打开 (进入输命令的)

docker run --name mginx01 -d nginx:1.22.0    --name   为容器分配一个名

docker run -it --rm rockylinux bash        当容器退出时自动删除

删除容器

docker rm -f `docker ps -aq`  删除所有容器

docker rm `docker ps -aq`  删除没有运行的容器

images 列出本地镜像

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

  • --digests :显示镜像的摘要信息;

  • -f :显示满足条件的镜像;

  • --format :指定返回值的模板文件;

  • --no-trunc :显示完整的镜像信息;

  • -q :只显示镜像ID。

docker rmi : 删除本地一个或多个镜像  -f强制  在运行强制删也没用

在容器在用时(stop是停,但是他还在用)删除镜像也是假删除,你虽然看不到他了,空间并没有删除,镜像列表不再显示,   只有他停了在删除,才是真正的删除

docker ps : 列出容器

  • -a :显示所有的容器,包括未运行的。

  • -f :根据条件过滤显示的内容。

  • --format :指定返回值的模板文件。

  • -l :显示最近创建的容器。

  • -n :列出最近创建的n个容器。

  • --no-trunc :不截断输出。

  • -q :静默模式,只显示容器编号。

  • -s :显示总的文件大小

从容器内退出

  1. 从容器内退出,并停止容器    exit
  2. 从容器内退出,且容器不停止   ctrl+p+q

 定义别名

vim .bashrc                这样删除方便

alias rmc='docker rm -f `docker ps -qa`'

. .bashrc

root权限问题--privileged 选项  尽量别用

--privileged 选项被引入docker。使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。

 内核是宿主机的内核,文件个是个的    例如

docker run -it --privileged --rm rockylinux bash       真正打开

他挂在查看的都是宿主机的硬盘 删除也是,尽量别用 

运行docker官方文档容器

显示当前存在容器

  • docker ps -f 'status=exited'   #查看退出状态的容器
  • docker ps -f 'status=running'   #只显示运行的容器
  • docker ps -l   #显示最新创建的容器(停止的容器也能显示)
  • docker ps -a -s  #显示容器大小
  • docker ps -a -q  #只显示容器ID
  • docker ps -a   #显示全部容器,包括退出状态的容器
  • docker ps #显示运行的容器

查看容器内的进程 

#docker run -d httpd
db144f1978148242dc20bd0be951628f1c00371b2c69dee53d84469c52995d8f

#docker top db144f19       #镜像前面的名字才行
UID PID PPID C STIME TTY TIME CMD
root 9821 9797 3 22:02 ? 00:00:00 httpd -DFOREGROUN

查看容器资源使用情况 

docker stats 251c7c7cf2aa      持续查看 一个

docker stats --no-stream 0e92b   一次性查看

--no-stream     ip号更全

docker stats   #查看所有容器

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" elasticsearch:7.6.2  #限制内存使用大小

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2  #默认启动elasticsearch会使用较多的内存

 查看容器的详细信息 inspect

docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等

docker inspect 9997

容器的启动和停止

docker start|stop|restart|pause|unpause 容器ID

给正在运行的容器发信号  docker kill

docker kill 可以给容器发信号,默认号SIGKILL,即9信号

#强制关闭所有运行中的容器 docker kill `docker ps -a -q`

进入正在运行的容器   双页面同步

docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有

docker run -it  nginx:1.22.0 bash   进去 ctrl+p+q 退出 这样他正在运行、

docker attach 94a5   #查看端口进去   ,在另一本台机器上也一样就可以了

使用exec命令

在运行中的容器启动新进程,可以执行单次命令,以及进入容器
测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式

-d, --detach   分离模式:在后台执行命令

-e, --env list    设置环境变量     

-it

 暴露所有容器端口  -P -p

容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务
docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始
使用随机端口 时,当停止容器后再启动可能会导致端口发生变化      就是映射到别的机器可以访问

docker run -d --name nginx01 -P nginx:1.22.0   #映射容器所有暴露端口至随机本地端口

iptables -vnL -t nat     #查看映射的端口号    docker ps 查看

curl 10.0.0.100:49153     #在别的主机ping下

docker run -d -p 80:80 --name name nginx01 nginx:1.22.0   指定端口映射
 

容器80端口映射宿主机本地随机端口
docker run -p 80 --name nginx-test-port1 nginx

容器80端口映射宿主机本地随机端口
docker run -p 81:80 --name nginx-test-port2 nginx

宿主机本地IP:宿主机本地端口:容器端口
docker run -p 10.0.0.100:82:80 --name nginx-test-port3 docker.io/nginx

宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始
docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx

宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议
docker run -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx

一次性映射多个端口+协议
docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx

查看容器的日志  docker logs nginx01

docker logs 可以查看容器中运行的进程在控制台输出的日志信息

docker logs -f nginx01   #持续跟踪

docker run alpine /bin/sh -c 'i=1;while true;do echo hello$i;let i++;sleep 2;done'  #在外面打印可看到,有的里面也行根据情况定   终端

docker logs 5126   
hello1
hello2

传递运行命令

容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令 

容器里的PID为1的守护进程的实现方式

  • 服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
  • 命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要tail -f <服务访问日志> 会产生不必要的磁盘IO

 大概意思就是当你运行程序时 它需要有默认进程才能起来,而这个默认进程你可以自己指定,默认模拟命令进程编号为1(在里面)

默认
root@f1abb81d0c88:/# ls /proc/1/exe -l
lrwxrwxrwx 1 root root 0 Oct 18 06:24 /proc/1/exe -> /usr/sbin/nginx

替换
docker run --name nginx01 nginx:1.22.0 tail -f /etc/hosts 
docker exec -it 2bc9fa486769 sh          run exec都可以
需要用一个持续运行的命令把他替掉 tail -f 可以秩序运行所以用它, /etc/hosts 这个也是自己随便指定的  ls也可以但是他会瞬间结束
总结:就是用一个持续运行的程序来替代最初的那个一
 

容器内部的hosts文件

容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP

[root@ubuntu1804 ~]#docker run -it centos /bin/bash

[root@598262a87c46 /]# 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 598262a87c46       #默认会将实例的ID 添加到自己的hosts文件,在容器里是可以ping通的容器外面不行

docker run -it --rm --add-host www.wangxiaochun.com:6.6.6.6--add-host www.wang.org:8.8.8.8 busybox     修改容器的 hosts文件,就是可以开始就加进去

/ # 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
6.6.6.6 www.wangxiaochun.com
8.8.8.8 www.wang.org
172.17.0.2 449bf0468efd

指定容器DNS

容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址

  • 将dns地址配置在宿主机
  • 在容器启动时加选项 --dns=x.x.x.x
  • 在/etc/docker/daemon.json 文件中指定
容器的DNS默认从宿主机的DNS获取
docker exec -it nginx01 bash
root@f6cfbd1a6adc:/# cat /etc/resolv.conf
# operation for /etc/resolv.conf.

nameserver 180.76.76.76
nameserver 223.6.6.6
search wei.com wei.org    #search 就是自动补全后面的命令,一不行就地第二,二不行就是失败

docker run -it --rm --add-host www.wei.com:6.6.6.6 --add-host www.wei.org:8.8.8.8 busybox
nameserver 180.76.76.76
nameserver 223.6.6.6
search wang.com wang.org

/ # ping www
PING www (47.93.189.255): 56 data bytes
64 bytes from 47.93.189.255: seq=0 ttl=127 time=8.766 ms
64 bytes from 47.93.189.255: seq=1 ttl=127 time=9.780 ms

指定DNS地址
[root@ubuntu1804 ~]#docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 centos bash
[root@ef9cacc74b58 /]# cat /etc/resolv.conf
search wangxiaochun.com wang.org
nameserver 1.1.1.1
nameserver 8.8.8.8
[root@ef9cacc74b58 /]# exit

指定domain名
[root@ubuntu1804 ~]#docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 --dns-search
a.com --dns-search b.com busybox
/ # cat /etc/resolv.conf
search a.com b.com
nameserver 1.1.1.1
nameserver 8.8.8.8

#用--dns指定优先级更高
[root@ubuntu1804 ~]#docker run -it --rm --dns 8.8.8.8 --dns 8.8.4.4 centos bash
[root@80ffe3547b87 /]# cat /etc/resolv.conf
search wangxiaochun.com wang.org
nameserver 8.8.8.8
nameserver 8.8.4.4
[root@80ffe3547b87 /]# exit

修改宿主机的docker 让其重启就可以自行更改 (配置文件在加速文件哪里更改)指定优先级高于配置

 [root@ubuntu1804 ~]#vim /etc/docker/daemon.json
[root@ubuntu1804 ~]#cat /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"],
"dns" : [ "114.114.114.114", "119.29.29.29"],
"dns-search": [ "wangxiaochun.com", "wang.org"]

[root@ubuntu2004 /]#systemctl restart docker.service  配置好后重启

[root@ubuntu2004 /]#docker run -it --rm busybox
/ # cat /etc/resolv.conf 
search wangxiaochun.com wang.org
nameserver 114.114.114.114
nameserver 119.29.29.29
/ # 

容器内和宿主机之间复制文件 cp  文件夹也可以

[root@ubuntu2004 /]#docker run -d --name b1 busybox sleep 100   #后台运行起来
307342a8497a544a89ab7f1642c520d366c7aadaea8c5c061107d85e7d60873d

  [root@ubuntu2004 /]#docker cp b1:/etc/hosts hosts.b1     把里面的的文件复制出来
[root@ubuntu2004 /]#cat hosts.b1 
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix

[root@ubuntu2004 /]#docker cp /etc/passwd b1:/etc/os    宿主机倒入
[root@ubuntu2004 /]#docker exec b1 cat /etc/os
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

  容器参数设置如密码之类 这个需要先去相关官网看看支持不支持

https://hub.docker.com/   docker里自己找       mysql为例  具体看官方   

[root@ubuntu2004 /]#docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wei mysql:8.0     #指定密码,映射端口,创建数据库wei 也可以写在--env-file里看下
Unable to find image 'mysql:8.0' locally
8.0: Pulling from library/mysql
72a69066d2fe: Pull complete 

[root@rocky8 ~]# mysql -uroot -p123456 -h10.0.0.100    #在另一台机器上链接
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wei                |
+--------------------+
5 rows in set (0.02 sec)

传递环境变量

有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现

 清除不再使用的数据

dangling images表示TAG为<none>的镜像
[root@ubuntu1804 ~]#docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache

#清除不再使用的镜像
[root@ubuntu1804 ~]#docker system prune -f -a   a所有  f强行

利用 Docker 快速部署自动化运维平台

拉取 启动 初始化

Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能
特性

  • 批量执行: 主机命令在线批量执行
  • 在线终端: 主机支持浏览器在线终端登录
  • 文件管理: 主机文件在线上传下载
  • 任务计划: 灵活的在线任务计划
  • 发布部署: 支持自定义发布部署流程
  • 配置中心: 支持 KV、文本、json 等格式的配置
  • 监控中心: 支持站点、端口、进程、自定义等监控
  • 报警中心: 支持短信、邮件、钉钉、微信等报警方式
  • 优雅美观: 基于 Ant Design 的 UI 界面
  • 开源免费: 前后端代码完全开源
  • 官网地址: https://www.spug.dev/
    使用文档:https://www.spug.dev/docs/about-spug/
    gitee链接: https://gitee.com/openspug/spug

拉取镜像 

[root@ubuntu1804 ~]# docker pull registry.aliyuncs.com/openspug/spug

启动容器 

[root@ubuntu1804 ~]#docker run -d --restart=always --name=spug -p 80:80
registry.aliyuncs.com/openspug/spug

# 持久化存储启动命令:
# mydata指的是本地磁盘路径,也可以是其他目录,但需要保证映射的本地磁盘路径已经存在,
/data是容器内代码和数据初始化存储的路径

$ docker run -d --restart=always --name=spug -p 80:80 -v /mydata/:/data
registry.aliyuncs.com/openspug/spug

 初始化

以下操作会创建一个用户名为 admin 密码为 123456 的管理员账户,可自行替换管理员账户。

[root@ubuntu1804 ~]#docker exec spug init_spug admin 123456

Migrations for 'account':
data/spug/spug_api/apps/account/migrations/0001_initial.py
- Create model Rol 

 Docker 镜像制作和管理

前台执行程序,能精简就精简

制作镜像方式

  • Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作.
  • Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像

docker commit   #通过修改现有容器,将之手动构建为镜像
docker build      #通过Dockerfile文件,批量构建为镜像 

docker commit  制作过程之修改现有容器,将之手动构建为镜像      #都手动完成无法自动化

[root@ubuntu2004 /]#docker run -it --name busyboy busybox sh   

/ # echo website on busybox > index.html  
/ # httpd                                          #写入内容启动

[root@ubuntu2004 ~]#curl 172.17.0.2      在用一主机上访问    访问完之后exit退出
website on busybox 

[root@ubuntu2004 /]#docker commit -a wei -m "init busyboy" busyboy bosybox:v1.0  
做以容器为标准做镜像     -a作者是谁      -m 提交做了啥
  
[root@ubuntu2004 /]#docker images
REPOSITORY                            TAG       IMAGE ID       CREATED         SIZE
bosybox                               v1.0      633af848349e   6 minutes ago   1.24MB
registry.aliyuncs.com/openspug/spug   latest    a6a4856a9f3b   3 months ago    698MB
busybox                               latest    beae173ccac6   9 months ago    1.24MB
mysql                                 8.0       3218b38490ce   10 months ago   516MB

[root@ubuntu2004 /]#docker run --name b1 -p 80:80 bosybox:v1.0 httpd -f #启动转前台

[root@ubuntu2004 ~]#curl 172.17.0.2  访问
website on busybox

利用 DockerFile 文件执行 docker build 自动构建镜像

DockerFile 是一种被Docker程序解释执行的脚本,由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,DockerFile更能直观的展示镜像是怎么产生的,有了DockerFile,当后期有额外的需求时,只要在之前的DockerFile添加或者修改响应的命令即可重新生成新的Docker镜像,避免了重复手动制作镜像的麻烦,类似与shell脚本一样,可以方便高效的制作镜像

Docker守护程序 Dockerfile 逐一运行指令,如有必要,将每个指令的结果提交到新镜像,然后最终输出新镜像的ID。Docker守护程序将自动清理之前发送的上下文

请注意,每条指令都是独立运行的,并会导致创建新镜像,比如 RUN cd /tmp 对下一条指令不会有任何影响。

Docker将尽可能重用中间镜像层(缓存),以显著加速 docker build 命令的执行过程,这由 Using
cache 控制台输出中的消息指示

Dockerfile 镜像制作和使用流程

Dockerfile文件的制作镜像的分层结构 

范例:

#按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
[root@ubuntu1804 ~]#mkdir
/data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,ubuntu,alpine,debian}} -p

[root@ubuntu1804 ~]#tree /data/dockerfile/
/data/dockerfile/
├── system
│ ├── alpine
│ ├── centos
│ ├── debian
│ └── ubuntu
└── web
├── apache
├── jdk
├── nginx
└── tomcat
 

 Dockerfile 文件说明

  • 每一行以Dockerfile的指令开头,指令不区分大小写,但是惯例使用大写
  • 使用 # 开始作为注释
  • 每一行只支持一条指令,每条指令可以携带多个参数
  • 指令按文件的顺序从上至下进行执行
  • 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
  • 制作镜像一般可能需要反复多次,每次执行dockfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件的后面

Dockerfile 相关指令

dockerfile 文件中的常见指令 

ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR

1. FROM: 指定基础镜像

定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。
FROM 就是指定基础镜像,此指令通常必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境
基础镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件.如果找不到指定的镜像文件,docker build会返回一个错误信息
如何选择合适的镜像呢?
对于不同的软件官方都提供了相关的docker镜像,比如: nginx、redis、mysql、httpd、tomcat等服务类的镜像,也有操作系统类,如: centos、ubuntu、debian等。建议使用官方镜像,比较安全。

关于scratch 镜像              所有镜像的祖宗最小镜像

FROM scratch
参考链接:
https://hub.docker.com/_/scratch?tab=description
https://docs.docker.com/develop/develop-images/baseimages/
该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像该镜像在构建基础镜像(例如debian和busybox)或超最小镜像(仅包含一个二进制文件及其所需内容,例如:hello-world)的上下文中最有用

范例: 

FROM scratch #所有镜像的起源镜像,相当于Object类
FROM ubuntu
FROM ubuntu:bionic
FROM debian:buster-slim

列:制作ubuntu镜像

[root@ubuntu2004 ~]#cd /data/dockerfile/system/ubuntu/  
[root@ubuntu2004 ubuntu]# vim Dockerfile
 #可以不叫这个名字但是如果不叫,需要制作的时候指定文件的名称才行  Dockerfile他为默认指定名称


FROM  ubuntu:22.04  指定版本名字,如果用空镜像里面什么都没有,你还需要把bash之类的相关路径考进去

~      :wq
[root@ubuntu2004 ubuntu]#docker build -t ubuntu:22.04-20221017 . 
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM ubuntu:22.04
 #-t指定名字  . 在当前路径去找 Dockerfile(默认文件)  需要在互联网拉取镜像

[root@ubuntu2004 ubuntu]#docker images
busybox                        latest           beae173ccac6   9 months ago    1.24MB
mysql                          8.0              3218b38490ce   10 months ago   516MB
ubuntu                        22.04            9d28ccdc1fc7   10 months ago   76.3MB
ubuntu                       22.04-20221017   9d28ccdc1fc7   10 months ago   76.3MB

2. LABEL: 指定镜像元数据 可以指定镜像元数据,如: 镜像作者等

[root@ubuntu2004 ubuntu]#vim Dockerfile

FROM ubuntu:22.04
LABEL Author=weizhaohui  version=ubuntu:22.04-v1.0  ORG=CSDN imperial
#   LABEL 标签      Author=指定作者     version=版本号       ORG=组织
:wq
[root@ubuntu2004 ubuntu]#docker build -t ubuntu:22.04-20221017 .   #把之前的覆盖下

嫌弃麻烦可以写个脚本
[root@ubuntu2004 ubuntu]#vim build.sh   
docker build -t ubuntu:$1 .

[root@ubuntu2004 ubuntu]#bash build.sh 22.04-20221017-v1.0
[root@ubuntu2004 ubuntu]#docker images
REPOSITORY                  TAG                   IMAGE ID       CREATED         SIZE
ubuntu                      22.04-20221017        e04f7e4a2dd5   2 minutes ago   76.3MB
ubuntu                      22.04-20221017-v1.0   e04f7e4a2dd5   2 minutes ago   76.3MB
bosybox                     v1.0                  633af848349e   2 hours ago     1.24MB

[root@ubuntu2004 ubuntu]#docker history ubuntu:22.04-20221017-v1.0   #查看镜像的制作过程
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
e04f7e4a2dd5   5 minutes ago   /bin/sh -c #(nop)  LABEL Author=weizhaohui v…   0B        
9d28ccdc1fc7   10 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      10 months ago   /bin/sh -c #(nop) ADD file:1e60bfbe5a32672bf…   76.3MB 

[root@ubuntu2004 ubuntu]#docker inspect ubuntu:22.04-20221017-v1.0   #查看详细信息


 进入 查看发现什么命令都没有

3. RUN: 执行 shell命令

RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令。
通常各种基础镜像一般都支持丰富的shell命令
注意: RUN 可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多个shell命令通过 && 连接一起成为在一条指令 每个RUN都是独立运行的,和前一个RUN无关

shell 是空格隔开    exec是在[ ] 里用,隔开

#shell 格式: 相当于 /bin/sh -c <命令> 此种形式支持环境变量
RUN <命令>
#exec 格式: 此种形式不支持环境变量,注意:是双引号,不能是单引号
RUN ["executable","param1","param2"...]
#exec格式可以指定其它shell
RUN ["/bin/bash","-c","echo hello wang"]

 修改次数多的在后面,修改次数少的在前面,这样一样的就不会重复占用资源

RUN 多的会占用资源 尽量少点  构建的时候执行    

[root@ubuntu2004 ubuntu]#vim Dockerfile 

FROM ubuntu:22.04
LABEL Author=weizhaohui  version=ubuntu:22.04-v1.0  ORG=CSDN.imperial
RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list &&  sed -i "s@http://.*security.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list && apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute  nfs-common lrzsz tree iotop unzip zip vim  && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime  
     #删除的那个是为了更改时间

#  RUN 支持丰富的shell命令  做些优化把从官方拉去改为清华源    apt update 记得

 ENV: 设置环境变量

ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持

FROM ubuntu:22.04
LABEL Author=weizhaohui  version=ubuntu:22.04-v1.0  ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
RUN  apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute  nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime 

ENV CLASS=mss DATE=2022-10-17

[root@ubuntu2004 ~]#docker run -it --rm -e CLASS=m33  ubuntu:22.04-20221017-v6.0 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=bb622ab86ad0
TERM=xterm
CLASS=m33          #可以自行定义
DATE=2022-10-17
HOME=/root

COPY: 复制文本

复制本地宿主机的 到容器中的 。

说明:

  • 可以是多个,可以使用通配符,通配符规则满足Go的filepath.Match 规则
  • filepath.Match 参考链接: https://golang.org/pkg/path/filepath/#Match
  • 必须是build上下文中的路径(为 Dockerfile 所在目录的相对路径),不能是其父目录中的文件
  • 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
  • 如果指定了多个, 或在中使用了通配符,则必须是一个目 录,且必须以 / 结尾
  • 可以是绝对路径或者是 WORKDIR 指定的相对路径
  • 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
  • 如果事先不存在,它将会被自动创建,这包括其父目录路径,即递归创建目录

 COPY 就是把当前文件的目录 复制到容器

FROM ubuntu:22.04
LABEL Author=weizhaohui  version=ubuntu:22.04-v1.0  ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
RUN  apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute  nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime 

ENV CLASS=mss DATE=2022-10-17

FROM ubuntu:22.04
LABEL Author=weizhaohui  version=ubuntu:22.04-v1.0  ORG=CSDN.imperial
COPY sources.list /etc/apt/sources.list
#RUN  apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute  nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime 

#ENV CLASS=mss DATE=2022-10-17


[root@ubuntu2004 ubuntu]#docker run -it --rm ubuntu:22.04-20221017-v1.0 cat /etc/apt/sources.list
显示复制的内容
deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn//ubuntu/ focal-backports main restricted universe multiverse

 ADD: 复制和解包文件

该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解压缩。可以将复制指定的 到容器中的

说明:

  • 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
  • 可以是绝对路径或者是 WORKDIR 指定的相对路径
  • 如果是目录,只复制目录中的内容,而非目录本身
  • 如果是一个 URL ,下载后的文件权限自动设置为 600
  • 如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名URL指定的文件将被直接下载并保存为/< filename>
  • 如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令,但是通过URL获取到的tar文件将不会自动展开
  • 如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则其被视作一个普通文件,的内容将被直接写入到

 纯之压缩不行 ,打包压缩可以

[root@ubuntu2004 ubuntu]# echo docker website > index.html
[root@ubuntu2004 ubuntu]#gzip index.html 



FROM ubuntu:22.04 
LABEL Author=weizhaohui  version=ubuntu:22.04-v1.0  ORG=CSDN.imperial       
COPY sources.list /etc/apt/sources.list
#RUN  apt update && apt -y install wget curl net-tools iproute2 tcpdump telnet traceroute  nfs-common lrzsz tree iotop unzip zip vim tzdata && rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/locatime  
 
#ENV CLASS=mss DATE=2022-10-17
ADD  index.html.tar.gz /data/www/  #他自己可以创建文件,解压

[root@ubuntu2004 ubuntu]#bash build.sh  22.04-20221017-v2.0 

 CMD: 容器启动命令

一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令.

  • 如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT命令,那么开启
  • 容器时就会使用执行CMD指定的默认的命令
  • 前面介绍过的 RUN 命令是在构建镜像时执行的命令,注意二者的不同之处
  • 每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
  • 如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令

# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量
CMD ["executable","param1","param2"]

# 在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量
CMD command param1 param2

# 提供给 ENTRYPOINT 命令的默认参数
CMD ["param1","param2"] 

 范例:

CMD ["nginx", "-g", "daemon off;"]

 编译安装nginx 镜像

 [root@ubuntu2004 nginx]#wget http://nginx.org/download/nginx-1.22.0.tar.gz   #下载源码


FROM  ubuntu:22.04-20221017-v1.0
ENV VERSTON="1.22.0"
ENV NGINX_INSTALL_DIR="/web/nginx"
LABEL Author=weizhaohui  version=nginx-${VERSTON}
RUN  sed -i "s@http://.*archive.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list &&  sed -i "s@http://.*security.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSTON}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSTON} && \
     ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make &&make install

EXPOSE 80
COPY  nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
ADD index.html.tar.gz /web/nginx/html/
CMD ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;"

  nginxd定制

[root@ubuntu2004 nginx]#docker cp  ac510c:/web/nginx/conf/nginx.conf /data/dockerfile/web/nginx/
[root@ubuntu2004 nginx]#vim nginx.conf

[root@ubuntu2004 nginx]#vim Dockerfile 

COPY  nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf    #加一行这个复制到里面,也方便改

ENTRYPOINT: 入口点

CMD和ENTRYPOINT共存 他会首先执行ENTRYPOINT 如果发现有CMD她会把她是做参数放在后面

通常用于金蝉脱壳 CMD和ENTRYPOINT 执行脚本  后面跟个exec “$@" 

当上个命令执行完到exec这里会把CMD的·参数替换到原本的ENTRYPOINT,这样相当于执行两边, CMD这种命令只能执行程序内只能执行一次 

功能类似于CMD,配置容器启动后执行的命令及参数 

  • ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果docker run 命令有参数,那么参数全部都会作为ENTRYPOINT的参数
  • 如果docker run 后面没有额外参数,但是dockerfile中有CMD命令(即上面CMD的第三种用法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数
  • 如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数
  • 可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格
  • 使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数
  • 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效通常会利用ENTRYPOINT指令配合脚本,可以为CMD指令提供环境配置
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值