docker-7-docker和dockerfile常用命令

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮冰燃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值