重启docker
systemctl restart docker
镜像相关命令
查看镜像
root@shuai:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.0.0 bc3c3a0caf79 35 hours ago 133MB
- REPOSITORY:镜像在仓库的名字
- TAG:镜像标签
- IMAGE ID:镜像ID
- CREATED:镜像创建日期
- SIZE:镜像大小
镜像默认存在Docker宿主机的/var/lib/docker 目录下
搜索镜像
root@shuai:/# docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 2309 [OK]
progrium/busybox 70 [OK]
拉取镜像
root@shuai:/# docker pull busybox
Using default tag: latest
删除镜像
# 通过ID删除
docker rmi 62d49f9bab67
# 通过name删除
root@shuai:/# docker rmi busybox
Untagged: busybox:latest
Untagged: busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
Deleted: sha256:69593048aa3acfee0f75f20b77acb549de2472063053f6730c4091b53f2dfb02
Deleted: sha256:5b8c72934dfc08c7d2bd707e93197550f06c0751023dabb3a045b723c5e7b373
容器相关命令
查看容器
# 查看正在运行的容器
root@shuai:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ea736ffba4e vite-front:1.0.0 "/docker-entrypoint.…" 35 hours ago Up 35 hours 8001/tcp
# 查看所有容器
root@shuai:~# docker ps -a
# 查看最后启动的容器
docker ps -l
# 列出最近创建的n个容器
docker ps -l -n 5
创建与启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- -i : 表示运行的容器
- -t : 容器启动后,会进入其命令行。加入-it两个参数,容器创建就能登录进去,即分配一个伪终端
- —name : 为创建的容器命名
- -v : 表示目录映射关系【前者是宿主机目录:后者是映射到宿主机上的目录】,挂载数据盘,可以使用多个-v做多个目录或文件的映射。
- -d : 在run后面加-d参数,会创建一个守护式容器在后台运行。这样创建容器后不会自动登录容器,如果只加-i和-t两个参数,创建的容器会自动进入容器里面。
- -p : 表示端口映射【前者是宿主机端口:后者是容器内映射端口】,可以使用多个-p做多个端口映射
- -P :随机使用宿主机的可用端口与容器内暴露的端口映射。
创建并进入容器
docker run -it —name 容器名称B 镜像名称A:标签 /bin/bash
创建镜像A创建一个容器B,并进入到容器的/bin/bash ```powershell root@shuai:~# docker run -it —name newnginx nginx /bin/bash root@289f826d4c19:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr
创建端口映射的容器
root@shuai:~# docker run -it -p 8001:80 —name portnginx nginx /bin/bash
进入容器后,启动nginx
root@40e63158567a:/# nginx
然后就可在端口8002看的nginx界面
<a name="kv0wu"></a>
#### 守护方式创建容器
```powershell
docker run -di --name 容器名称 镜像名称:tag
登录守护式容器
docker exec -it 容器名称|容器ID /bin/bash
停止与启动容器
# 停止
docker stop 容器名称|容器ID
# 启动
docker start 容器名称|容器ID
文件拷贝
将文件拷贝到容器内可以使用cp命令
# 语法
docker cp 需要拷贝的文件目录 容器名称:容器目录
root@shuai:~# docker cp /code/nodejs portnginx:/usr/share/nginx/html
# 进入到容器
root@shuai:~# docker exec -it portnginx /bin/bash
# 查看拷贝的进入的文件
root@40e63158567a:/# cd /usr/share/nginx/html
root@40e63158567a:/usr/share/nginx/html# ls
50x.html index.html nodejs
也可以将文件从容器内拷贝出来
# 语法
docker cp 容器名称:容器目录 需要拷贝的文件目录
# 从容器中拷贝出文件
root@shuai:~# docker cp portnginx:/usr/share/nginx/html /code/nginx
# 查看拷贝出来的文件内容
root@shuai:/code/nginx# ls
50x.html index.html
目录挂载
创建容器后,将宿主机的目录与容器内的目录进行映射,就可以通过修改宿主机某个目录的文件内容直接修改容器内的文件内容。这个操作是双向绑定的,容器内修改文件内容也会同步影响宿主机内容,实现数据备份功能。
容器被删除后,宿主机的内容并不会被删除。
如果多个容器挂载同一个目录,其中一个容器被删除,其他容器内容不会受到影响。
容器与宿主机直接的数据卷属于引用关系,数据卷是从外界挂载到容器内的,所以可以脱离容器的生命周期而独立存在。 由于数据卷的生命周期并不同于容器的生命周期,在容器退出或删除后,数据卷不受影响,数据卷的生命周期会一直持续到没有容器使用它为止。
创建容器添加 -v 参数,格式为 宿主机目录:容器目录
# 创建本地/code/nginx目录和容器的/usr/share/nginx/html目录关联
root@shuai:~# docker run -di -p 8002:80 -v /code/nginx:/usr/share/nginx/html --name filev nginx
# 修改本地的文件
root@shuai:/code/nginx# vi index.html
# 查看容器内的文件,首先进入容器
root@shuai:/code/nginx# docker exec -it filev /bin/bash
# 切换文件目录
root@33e0165d28b5:/# cd /usr/share/nginx/html/
root@33e0165d28b5:/usr/share/nginx/html# ls
50x.html index.html
# 查看index的内容
root@33e0165d28b5:/usr/share/nginx/html# cat index.html
docker run -di -p 宿主机端口:容器服务端口 -v 宿主机目录:容器目录 —name nginxVolumes nginx 多目录挂载 docker run -di -p 宿主机端口:容器服务端口 -v 宿主机目录:容器目录 -v 宿主机目录2:容器目录2 —name nginxVolumes2 nginx
匿名挂载
匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volumes 中生成。
# 匿名挂载到本地,创建nginx容器
docker run -di -v /usr/share/nginx/html --name nginx01 nginx
# 查看volumes 数据卷信息
root@shuai:/var/lib/docker/volumes# docker volume ls
DRIVER VOLUME NAME
local 3361051ffb7a8a726cfdb2de09f65334139cbcccf9407eaf8573f092b8a88882
local cd5d8ac03b4034ddc9eb461f7c110fdd2d0ce0fe5aad7d979f8d47ddf938f914
# 切换目录到cd5d8
root@shuai:cd5d8...# cd _data/
root@shuai:cd5d8.../_data# ls
50x.html index.html
# 修改index文件就会同步更新
查看匿名挂载的数据卷和容器的对应关系
通过 docker inspect nginx02 ,查看Mounts的Source路径
#编辑数据卷
docker volume ls : List volumes
docker volume prune : Remove all unused local volumes
docker volume rm : Remove one or more volumes
具名挂载
具名挂载是给数据卷起个名字,容器外对应的目录会在/var/lib/docker/volume 中生成。
# 指定数据卷名称set_nginx02_volume,位置还是在/var/lib/docker/volume下
docker run -di -v set_nginx02_volume:/usr/share/nginx/html --name nginx01 nginx
指定目录挂载
docker run -di -p 8003:80 -v /code/nginx:/usr/share/nginx/html --name filev nginx
如果在创建容器是没有进行目录挂载,可以修改Mounts
docker inspect 容器名 修改Mounts
# 查找到json并修改
vi /var/lib/docker/containers/container-ID/config.v2.json
#修改配置文件中的目录位置,然后保存退出
"MountPoints":{
"/home":{
"Source":"/docker",
"Destination":"/home",
"RW":true,
"Name":"",
"Driver":"",
"Type":"bind",
"Propagation":"rprivate",
"Spec":{"Type":"bind","Source":"//docker/","Target":"/home"}
}
}
查看目录挂载关系
docker volume inspect set_nginx02_volume
只读/读写
# 只读,通过修改宿主机内容实现对容器的数据管理
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据
docker run -it -v /宿主机目录:/容器目录:rw 镜像名
volumes-from(继承)
# 容器nginx02 指定目录挂载
docker run -di -p 8003:80 -v /code/nginx:/usr/share/nginx/html --name nginx02 nginx
# 容器nginx03/nginx04 都继承nginx02的挂载目录
docker run -di --volumes-from nginx02 --name nginx03 nginx
docker run -di --volumes-from nginx02 --name nginx04 nginx
查看容器IP地址
可以通过查看容器元信息
docker inspect 容器名|ID
也可执行下面命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名|ID
删除容器
只能删除未启动的容器,启动的容器需要先停止stop或kill
# 停止运行的容器
docker stop portnginx
# 删除容器
docker rm protnginx
Dockerfile
官方说明:https://docs.docker.com/engine/reference/builder/
在Docker中构建镜像最常用的方式是使用Dockerfile。Dockerfile是一个用来构建镜像的文本文件,该文件包含了多条构建镜像所需的指令和说明。使用docker build 用户可以创建连续执行多个命令行指令的自动构建。
使用当前目录 ( .) 作为构建上下文的构建命令:
$ docker build .
要提高构建的性能,可通过将 .dockerignore 文件添加到上下文目录来排除文件和目录。
格式Dockerfile
# Comment
INSTRUCTION arguments
该指令不区分大小写。但是,约定是将它们大写,以便更容易地将它们与参数区分开来。
DockerDockerfile按顺序运行指令。一个Dockerfile 必须以开始FROM的指令。这可能在解析器指令、注释和全局范围的 ARG 之后。该FROM指令指定您正在构建的父映像。FROM前面只能有一个或多个ARG指令,这些指令声明FROM在Dockerfile.
From指令
语法:From :
指明构建的新镜像来自远哪个基础镜像,如果没有选择tag,默认使用latest
FROM centos:7
如果不以任何镜像为基础,可以使用scratch。 官方说,scratch镜像是一个空惊喜,可以用于构建busybox等超小镜像。
LABEL
语法:LABEL
功能是给镜像指定标签,也可以用LABEL来指定镜像作者
LABEL maintainer="shenshuai89"
RUN
语法:RUN
构建镜像时运行的shell命令,比如构建的新镜像中想在/usr/local目录下创建一个java目录
RUN mkdir -p /usr/local/node
ADD
语法:ADD
拷贝文件或目录到镜像中。src可以是本地文件或压缩包,压缩文件会自动解压。还可以是一个url,如果把src设置为url,那么ADD类似于wget命令,然后自动下载和解压。
ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java
COPY
语法:COPY
拷贝文件或目录到镜像,用法和ADD相似,只是不支持自动下载和解压。
COPY指令从中复制新文件或目录
COPY jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java
EXPOSE
通知DOCKER容器运行时的监听端口给外部,可以指定端口是监听TCP还是UDP,如果未指定协议,默认TCP。
EXPOSE指令实际上并未发布端口。它充当构建镜像的人和运行容器的人之间的一种文档,关于打算发布哪些端口。
EXPOSE <port> [<port>/<protocol>...]
# 应用
EXPOSE 80 443 8080/tcp
无论EXPOSE设置如何,您都可以在运行时使用-p标志覆盖它们。
docker run -p 80:80/tcp -p 80:80/udp
ENV
设置容器内的环境变量
语法:
- ENV
: 添加单个参数 - ENV
= = : 添加多个参数 ```powershell 单条添加
ENV MY_NAME=”John Doe” ENV MY_DOG=Rex\ The\ Dog ENV MY_CAT=fluffy
多条添加
ENV MY_NAME=”John Doe” MY_DOG=Rex\ The\ Dog \ MY_CAT=fluffy
<a name="D6IqI"></a>
### CMD
CMD和ENTRYPOINT指令定义运行的容器中时什么命令得到执行。
1. Dockerfile 应至少指定CMD或ENTRYPOINT命令之一。
2. ENTRYPOINT 应在将容器用作可执行文件时进行定义。
3. CMD应该用作定义ENTRYPOINT命令的默认参数或在容器中执行临时命令的一种方式。
4. CMD 使用替代参数运行容器时将被覆盖。
CMD指令有三种形式
- CMD ["executable","param1","param2"] :比如CMD ["/usr/local/tomcat/bin/runshell.sh", "run"]
- CMD ["param1","param2"] : 比如 CMD [ "echo", "$JAVA_HOME"]
- CMD command param1 param2: 比如:CMD echo $JAVA_HOME
启动容器执行shell命令,在Dockerfile中只能有一条CMD指令,如果是多条,只有最后一条CMD生效
> 如果创建容器的时候指定命令,则CMD命令会被替代。如果想不被覆盖,使用下一条命令ENTRUPOINT
> docker run -it --name nginx02 nginx echo "hello nginx"
> docker run -it --name nginx03 nginx /bin/bash
> 以上两条指向就不会数据配置的环境变量信息,因为CMD被echo "hello nginx" 和/bin/bash覆盖
<a name="MXKGT"></a>
### ENTRUPOINT
ENTRYPOINT 有两种形式:
```powershell
# 第一种
ENTRYPOINT ["executable", "param1", "param2"]
示例: ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
# 第二种
ENTRYPOINT command param1 param2
示例:ENTRYPOINT echo $JAVA_HOME
启动容器时设置的shell命令,同CMD类似,但是不会被docker run命令行指定的参数覆盖。
在Dockerfile中只能有一条ENTRYPOINT指令,如果设置多条,只有最后一天生效。
WORKDIR
为RUN/CMD/ENTRYPOINT/COPY/ADD设置工作目录
语法:WORKDIR /path/to/workdir
该WORKDIR指令可以在一个Dockerfile. 如果提供了相对路径,它将相对于前一条WORKDIR指令的路径 。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最终pwd命令的输出Dockerfile将是/a/b/c.
VOLUME
语法:VOLUME [“/data”]
VOLUME ["/var/lib/mysql"]
VOLUME指令创建一个具有指定名称的挂载点到宿主机,并将其标记为保存来自本机主机或其他容器的外部挂载卷。
该值可以是 JSON 数组、VOLUME [“/var/log/“]或带有多个参数的纯字符串,例如VOLUME /var/log或VOLUME /var/log /var/db。
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
Dockerfile 会docker run生成一个映像,该映像会导致创建新的挂载点/myvol并将greeting文件复制 到新创建的卷中