Dockerfile命令详解之 COPY
Dockerfile命令详解之 ADD
Dockerfile命令详解之 RUN
1 服务相关命令
#systemctl start docker启动
#systemctl status docker状态
#systemctl stop docker停止
#systemctl restart docker重启
#systemctl enable docker开机自启动
2 镜像相关命令
(1)#docker images查看本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像名称 版本号 ID号 创建时间 大小
(2)# docker search redis搜索远程镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
镜像名称 描述信息 关注度 官方 自动流程构建
(3)# docker pull redis下载远程镜像
【Using default tag: latest】
【latest: Pulling from library/redis】
(4)如何拉取指定版本
登录https://hub.docker.com/-->搜索redis
查看Supported tags and respective Dockerfile links都有哪些版本
#docker pull redis:5.0.7
(5)# docker rmi redis:5.0.7删除本地指定镜像
(6)# docker images -q查看本地所有镜像的ID
(7)# docker rmi `docker images -q`删除本地所有镜像
(8)镜像打包
推荐使用镜像的名字进行打包,例如:
#docker save -o redis-5.0.2.tar redis:5.0.2
此方式打包的镜像,解压出来就有镜像名称了。
3 容器相关命令
#docker pull centos:7
3.1 创建容器
1 创建容器的方式一
(1)创建容器【创建完以后,会直接进入容器】
# docker run -it --name=c1 centos:7 /bin/bash
(2)退出容器【用-it创建的容器,退出后,会停止运行】
[root@cf18727fd569 /]# exit
(3)# docker ps查看当前正在运行的容器
(4)# docker ps -a查看所有的容器
2 创建容器的方式二
(1)# docker run -id --name=c2 centos:7创建容器
(2)# docker exec -it c2 /bin/bash进入容器
(3)退出容器【用-id创建的容器,退出后,不会停止运行】
[root@1f4ff3d28199 /]# exit
(4)# docker ps查看当前正在运行的容器
(5)# docker ps -a查看所有的容器
3 参数说明
-i:保持容器运行
-t:为容器重新分配一个伪输入终端
-d:以守护模式运行容器
-it创建的容器一般称为交互式容器,自动进入,退出关闭
-id创建的容器一般称为守护式容器,使用docker exec进入,退出不关闭
4 #docker stop c2停止指定容器
5 #docker rm c1删除指定容器
6 #docker ps -aq查看所有容器的ID
7 #docker rm `docker ps -aq`删除所有容器
8 #docker inspect c2查看容器的详细信息
3.2 批量删除已退出的容器
#docker container prune 命令,删除孤立的容器
4 容器的数据卷
4.1 数据卷的概念
(1)思考
(1-1)Docker容器删除后,在容器中产生的数据还在吗?【不在】
(1-2)Docker容器和外部机器可以直接交换文件吗?【不能】
(1-2)容器之间想要进行数据交互?
(2)数据卷的概念
(2-1)数据卷是宿主机中的一个目录或文件。
(2-2)当容器目录和数据卷目录绑定后,对方的修改会立即同步。
(2-3)一个数据卷可以被多个容器同时挂载。
(2-4)一个容器也可以被挂载多个数据卷。
(2-5)数据卷作用
(2-5-1)容器数据持久化。
(2-5-2)外部机器和容器间接通信。
(2-5-3)容器之间数据交换。
(3)多容器进行数据交换的方式:
(3-1方式一)多个容器挂载同一个数据卷。
(3-2方式二)数据卷容器。
4.1 配置数据卷
(1)创建启动容器时,使用-v参数设置数据卷
【docker run ... -v 宿主机目录(文件):容器内目录(文件)】
【注意事项:目录必须是绝对路径】
【注意事项:若目录不存在,会自动创建,宿主机和容器都会自动创建】
【注意事项:可以挂载多个数据卷】
(1-1)挂载1个
#docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
[root@myname data]# touch my.txt宿主机创建文件
[root@cd77dd519015 data_container]# ls容器中查看存在my.txt
[root@cd77dd519015 data_container]# vi my.txt 容器中输入数据
[root@myname data]# cat my.txt 宿主机查看到数据
#docker rm c1
删除容器后,宿主机数据仍存在
#docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
再次创建容器,数据存在,完成持久化
(1-2)挂载多个
#docker run -it --name=c2 -v /root/data1:/root/data1 -v /root/data2:/root/data2 centos:7 /bin/bash
(1-3)两个容器挂载同一个数据卷
#docker run -it --name=c3 -v /root/data:/root/data centos:7
#docker run -it --name=c4 -v /root/data:/root/data centos:7
4.2 配置数据卷容器
(1-1)创建启动c3数据卷容器,使用-v参数设置数据卷
#docker run -it --name=c3 -v /volume centos:7 /bin/bash
(1-2)创建c1、c2容器,使用--volumes-from参数 设置数据卷
#docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
#docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
5 容器之间通讯network
docker为容器创建独立的网络环境,实现宿主和容器、容器之间的网络隔离,默认使用bridge模式的网络,实现容器之间、容器与宿主机之间、乃至与外界之间的网络通信。
但是我们在实际部署应用的时候,发现并不能直接通过容器内部端口访问另外一个容器的应用(比如:mysql容器端口是3306,web应用不能直接通过3306访问mysql),而是通过端口映射到宿主机器来实现容器之间的访问。
那么有什么方式能实现直接通过容器内部端口进行数据通讯呢?
那就是通过network方式。
docker network创建一个桥接网络,在docker run的时候将容器指定到新创建的桥接网络中,这样同一桥接网络中的容器就可以互相访问。
#docker network create my-network # 创建network
#docker network ls
可以看到my-network已经创建好。
创建容器时指定网络,在创建容器时指定使用my-network网络。
docker run -d --name mysql --network my-network -e MYSQL_ROOT_PASSWORD=bigdata mysql:5.7
6 dockerfile相关命令
指令不区分大小写。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。
6.1 COPY
ADD指令可以拉去远程文件。COPY只能复制本地文件。
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
宿主机:(这里指的是安装有Docker引擎的那台服务器)。
<src>:相对路径,指的是相对于宿主机上构建目录的文件路径。
<dest>:指的是容器内的路径,如果是相对路径,则是相对于WORKDIR的路径。
举例如下:有一个Dockerfile放在/usr/local目录下,需要将/usr/local/app/hello.jar拷贝到容器WORKDIR下的build目录中,Dockerfile可以这样写:
FROM openjdk:11
WORKDIR /app
COPY app/hello.jar build/
这里的app/hello.jar是写的宿主机的相对路径,表示的是相对于构建目录的路径。此时构建目录是/usr/local,所以src实际上的绝对路径就是:/usr/local/app/hello.jar。
这里的build/是写的容器内的相对路径,表示的是相对于WORKDIR的路径。此时WORKDIR的路径是/app,所以dest实际上的绝对路径就是:/app/build/。
COPY指令中也可以使用通配符,复制匹配到的文件。
比如:要将/usr/local/app下的所有jar文件复制到容器中的/app/build/目录下,我们可以这样写Dockerfile。
FROM openjdk:11
WORKDIR /app
# 匹配以jar为后缀的文件
COPY app/*.jar build/
6.2 ADD
ADD指令可以拉去远程文件。COPY只能复制本地文件。
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
宿主机(这里指的是安装有Docker引擎的那台服务器)
<src>:宿主机文件所在路径或远程文件url,如果是宿主机本地文件,
填写的路径可以是相对路径(相对路径,则是目标文件与构建上下文的相对路径)。
<dest>:指的是容器内的路径,如果是相对路径,则是相对于WORKDIR的路径。
如果<src>是一个目录,将复制该目录的全部内容,包括文件系统元数据。
(不会复制指定的目录本身,只会复制目录下的内容)。
复制多个文件时,<dest>必须以斜杆/结尾。
6.3 RUN
使用RUN指令都会在当前镜像最顶层生成新的层,并提交到执行结果。Dockerfile中的后续步骤可以使用提交的结果。由于每次使用RUN指令都会生成新的层,所以建议多个Shell在同一个RUN指令中声明。
RUN <command>
由于每次使用ADD、COPY、RUN指令都会生成新的层,会导致层数过多,镜像文件增大,所以上面的RUN指令,我们可以合并为一条,其中\为换行符,多个shell命令之间用&&连接。
RUN apt update && \
apt install -y iptables iproute2 procps