1. 使用:
1.1 查看docker版本
docker version
1.2 镜像操作:
1.2.1 查看所有镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2b7d6430f78d 6 days ago 142MB
busybox latest 7a80323521cc 4 weeks ago 1.24MB
# 解释
REPOSITORY # 镜像仓库源
TAG # 镜像的标签
IMAGE ID # 镜像的ID
CREATED # 镜像的创建时间
SIZE # 镜像的大小
--all , -a Show all images (default hides intermediate images) # 显示所有
--digests Show digests
--filter , -f Filter output based on conditions provided
--format Pretty-print images using a Go template
--no-trunc Don’t truncate output
--quiet , -q Only show numeric IDs # 只显示id
1.2.2 搜索镜像
docker search 镜像名
# 解释
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
docker search mysql --filter=STARS=3000 # 搜索出Stars大于3000的
1.2.3 下载镜像
docker pull 镜像名[:tag] # 不写tag,默认是lasest
1.2.4 删除镜像
docker image rm XXXX # XXXX 镜像名字或者ID
可选参数:
--force, -f # 强制删除映像
--no-prune # 不要删除未标记的父映像
# 删除一个 可以通过名称 也可以指定id -f表示强制
docker rmi -f 9cfcce23593a
# 删除多个 用空格分隔id
docker rmi -f 镜像id 镜像id 镜像id
# 删除所有
docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除
1.2.5 镜像导入和导出
#导出
docker image save nginx:1.20.0 -o nginx.image # 导出nginx 版本为1.20.0 当前目录输出文件名为nginx.image
#导入
docker image load -i ./nginx.image # 导入nginx 当前目录的文件名为nginx.image
1.2.6 镜像编译(dockerfile)
#编译 build
docker image build -t hello[:1.0] . # 将目录.(当前目录)下dockerfile文件进行编译,-t =名字[:版本号(默认latest)]
#例
docker images build -f dockerfile -t nginx-my .
1.2.7 对已存在镜像变更新的标记
#标记 tag
docker image tag nginx piaohan/nginx:1.0 # 将镜像nginx克隆为piaohan/nginx版本号1.0的镜像
1.2.8 镜像发布(登录)
#docker Hub 发布 需要先登录
docker login
1.2.9 镜像发布(发布)
#docker Hub 发布
#需要先登录
#发布 push
docker image push piaohan/nginx:1.0 # 将piaohan/nginx:1.0 推送到dockerHub上
1.2.9 镜像拉取
#docker Hub
#需要先登录
#发布 pull
docker image pull piaohan/nginx:1.0 # 将piaohan/nginx:1.0 镜像 拉取下来
1.2.10 镜像分层(创建的历史记录)
#查看本地镜像分层
docker image history piaohan/nginx # piaohan/nginx:1.0 层级情况和大小
1.3 容器操作:
1.3.1 查看当前的容器
docker ps [可选参数] # 当前正在运行的容器
docker ps -a # 当前所有的容器(包括停止的)
1.3.2 创建并运行容器
# docker container run nginx
# 启动并进入容器
docker run -it nginx /bin/bash
# 等价于:先run启动,然后通过exex /bin/bash 进入容器
docker run -it nginx
docker exec -it 容器id /bin/bash
docker run --rm -it 容器id /bin/bash # 运行后退出自动删除容器
1.3.3 退出容器
exit //停止容器
ctr+p+q //非停止容器
1.3.4 删除容器
docker rm [可选参数] 容器id
# 删除所有容器 -f 强制的
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm
1.3.5 启动、重启、停止、杀死容器
启动:docker start 容器id
重启:docker restart 容器id
停止:docker stop 容器id
杀死:docker kill 容器id
1.3.6 查看容器运行的命令
C:\Users\Administrator> docker ps # 查看运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
915ed8e9fed3 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp eager_bardeen
C:\Users\Administrator> docker top 91 # 查看容器运行的命令
UID PID PPID C STIME TTY TIME CMD
root 1646 1626 0 17:06 ? 00:00:00 nginx: master process nginx -g daemon off;
uuidd 1703 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1704 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1705 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1706 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1707 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1708 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1709 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1710 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1711 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1712 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1713 1646 0 17:06 ? 00:00:00 nginx: worker process
uuidd 1714 1646 0 17:06 ?
1.3.7 通过容器提交为镜像
docker container commit #容器Id [重新命名(piaohan/nginx)[:版本号]]
#可以将新创建的镜像push到dockerHub上
1.3.8 清理已经停止的容器
docker system prune -f
扩展
prune 命令用来删除不再使用的 docker 对象。
删除所有未被 tag 标记和未被容器使用的镜像:
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
删除所有未被容器使用的镜像:
$ docker image prune -a
删除所有停止运行的容器:
$ docker container prune
删除所有未被挂载的卷:
$ docker volume prune
删除所有网络:
$ docker network prune
删除 docker 所有资源:
$ docker system prune
1.4 dockerfile
1.4.1 FROM
基础镜像的选择
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
bitnami/nginx 1.18.0 dfe237636dde 28 minutes ago 89.3MB
nginx 1.21.0-alpine a6eb2a334a9f 2 days ago 22.6MB
nginx 1.21.0 d1a364dc548d 2 days ago 133MB
假如我们有一个 index.html
文件
<h1>Hello Docker</h1>
准备一个Dockerfile
FROM nginx:1.21.0-alpine
ADD index.html /usr/share/nginx/html/index.html
1.4.2 RUN
(执行指令)
RUN
主要用于在Image里执行指令,比如安装软件,下载文件等
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz
RUN tar zxf ipinfo_2.0.1_linux_amd64.tar.gz
RUN mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo
RUN rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ipinfo latest 97bb429363fb 4 minutes ago 138MB
ubuntu 21.04 478aa0080b60 4 days ago 74.1MB
$ docker image history 97b
IMAGE CREATED CREATED BY SIZE COMMENT
97bb429363fb 4 minutes ago RUN /bin/sh -c rm -rf ipinfo_2.0.1_linux_amd… 0B buildkit.dockerfile.v0
<missing> 4 minutes ago RUN /bin/sh -c mv ipinfo_2.0.1_linux_amd64 /… 9.36MB buildkit.dockerfile.v0
<missing> 4 minutes ago RUN /bin/sh -c tar zxf ipinfo_2.0.1_linux_am… 9.36MB buildkit.dockerfile.v0
<missing> 4 minutes ago RUN /bin/sh -c wget https://github.com/ipinf… 4.85MB buildkit.dockerfile.v0
<missing> 4 minutes ago RUN /bin/sh -c apt-get install -y wget # bui… 7.58MB buildkit.dockerfile.v0
<missing> 4 minutes ago RUN /bin/sh -c apt-get update # buildkit 33MB buildkit.dockerfile.v0
<missing> 4 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 4 days ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
<missing> 4 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 811B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:d6b6ba642344138dc… 74.1MB
改进版
FROM ubuntu:20.04
RUN apt-get update && \
apt-get install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \
tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \
mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ipinfo-new latest fe551bc26b92 5 seconds ago 124MB
ipinfo latest 97bb429363fb 16 minutes ago 138MB
ubuntu 21.04 478aa0080b60 4 days ago 74.1MB
$ docker image history fe5
IMAGE CREATED CREATED BY SIZE COMMENT
fe551bc26b92 16 seconds ago RUN /bin/sh -c apt-get update && apt-get… 49.9MB buildkit.dockerfile.v0
<missing> 4 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 4 days ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
<missing> 4 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 811B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:d6b6ba642344138dc… 74.1MB
1.4.3 文件复制和目录操作 (ADD
,COPY
,WORKDIR
)
往镜像里复制文件有两种方式,COPY
和 ADD
, 我们来看一下两者的不同。
复制普通文件
COPY
和 ADD
都可以把local的一个文件复制到镜像里,如果目标目录不存在,则会自动创建
FROM python:3.9.5-alpine3.13
COPY hello.py /app/hello.py
比如把本地的 hello.py 复制到 /app 目录下。 /app这个folder不存在,则会自动创建
复制压缩文件
ADD
比 COPY
高级一点的地方就是,如果复制的是一个gzip等压缩文件时,ADD会帮助我们自动去解压缩文件。
FROM python:3.9.5-alpine3.13
ADD hello.tar.gz /app/
如何选择
因此在 COPY
和 ADD
指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY
指令,仅在需要自动解压缩的场合使用 ADD
。
目录的切换
WORKDIR
切换到目录,如果目录不存在会创建该目录
FROM python:3.9.5-alpine3.13
WORKDIR /app
COPY hello.py hello.py
1.4.4 构建参数和环境变量 (ARG
vs ENV
)
ARG
和 ENV
是经常容易被混淆的两个Dockerfile的语法,都可以用来设置一个“变量”。 但实际上两者有很多的不同。
FROM ubuntu:20.04
RUN apt-get update && \
apt-get install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \
tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \
mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
ENV
FROM ubuntu:20.04
ENV VERSION=2.0.1
RUN apt-get update && \
apt-get install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
ARG
FROM ubuntu:20.04
ARG VERSION=2.0.1
RUN apt-get update && \
apt-get install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
区别
ARG
可以在镜像build的时候动态修改value, 通过 --build-arg
$ docker image build -f .\Dockerfile-arg -t ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0 .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ipinfo-arg-2.0.0 latest 0d9c964947e2 6 seconds ago 124MB
$ docker container run -it ipinfo-arg-2.0.0
root@b64285579756:/#
root@b64285579756:/# ipinfo version
2.0.0
root@b64285579756:/#
ENV
设置的变量可以在Image中保持,并在容器中的环境变量里
1.4.5 容器启动命令1: CMD
CMD
可以用来设置容器启动时默认会执行的命令。
原则:
容器启动时默认执行的命令
如果docker container run启动容器时指定了其它命令,则
CMD
命令会被忽略如果定义了多个
CMD
,只有最后一个会被执行。
FROM ubuntu:20.04
ENV VERSION=2.0.1
RUN apt-get update && \
apt-get install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
CMD ["ipinfo"]
docker image build -t ipinfo . # 编译当前目录的dockerfile
docker run -it ipinfo
上述镜像做容器运行时 会自动运行ipinfo 这个命令 遵循第三原则
1.4.6 容器启动命令2: ENTRYPOINT
ENTRYPOINT
也可以设置容器启动时要执行的命令,但是和CMD
是有区别的。
CMD
设置的命令,可以在docker container run 时传入其它命令,覆盖掉CMD
的命令,但是ENTRYPOINT
所设置的命令是一定会被执行的。ENTRYPOINT
和CMD
可以联合使用,ENTRYPOINT
设置执行的命令,CMD传递参数
FROM ubuntu:20.04
CMD ["echo", "hello docker"]
把上面的Dockerfile build
成一个叫 demo-cmd
的镜象
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
demo-cmd latest 5bb63bb9b365 8 days ago 74.1MB
FROM ubuntu:20.04
ENTRYPOINT ["echo", "hello docker"]
build
成一个叫 demo-entrypoint
的镜像
$ docker build -t demo-entrypoint .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
demo-entrypoint latest b1693a62d67a 8 days ago 74.1MB
CMD
的镜像,如果执行创建容器,不指定运行时的命令,则会默认执行CMD
所定义的命令,打印出hello docker
$ docker container run -it --rm demo-cmd
hello docker
但是如果我们docker container run
的时候指定命令,则该命令会覆盖掉CMD
的命令,如:
$ docker container run -it --rm demo-cmd echo "hello world"
hello world
但是ENTRYPOINT
的容器里ENTRYPOINT
所定义的命令则无法覆盖,一定会执行
$ docker container run -it --rm demo-entrypoint
hello docker
$ docker container run -it --rm demo-entrypoint echo "hello world"
hello docker echo hello world
2. 案例
2.1 下载centos 镜像
docker pull centos
2.2 新建容器实例并启动
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名字,用于区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 如-p 8080::8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-p 随机指定端口
# 测试,启动并进入容器
docker run -it centos /bin/bash
# 等价于:
docker run -it centos
docker exec -it 容器id /bin/bash
# 查看目录,查看容器内的centos,基本版本,很多命令都是不完善的!
ls
# 退出,从容器中退回主机
exit
2.3 查看运行的容器
# 查看正在运行的容器
docker ps
# 查看所有(包括曾经)运行的容器
docker ps -a
# 显示最近创建的容器,设置显示个数
docker ps -a - n=?
# 只显示容器的编号(容器id)
docker ps -aq
[root@192 ~]docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@192 ~]docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9939864fa2e6 centos "bin/bash" 4 minutes ago Exited (0) 4 minutes ago unruffled_knuth
5f42e9930435 centos "/bin/bash" 8 minutes ago Exited (0) 4 minutes ago lucid_cannon
a89ddb393d3d bf756fb1ae65 "/hello" 19 hours ago Exited (0) 19 hours ago gracious_bhabha
[root@192 ~] docker ps -a -n=2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9939864fa2e6 centos "bin/bash" 6 minutes ago Exited (0) 6 minutes ago unruffled_knuth
5f42e9930435 centos "/bin/bash" 10 minutes ago Exited (0) 7 minutes ago
[root@192 ~] docker ps -aq
9939864fa2e6
5f42e9930435
a89ddb393d3d
2.4 退出容器
# 容器停止退出
exit
# 容器不停止退出 注意必须在英文输入法下,中文输入法不行
Ctrl + P + Q
[root@192 ~] docker run -it centos /bin/bash
[root@bfcea13c40cd /] docker ps ##注意这里会自动给个命令,删掉
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfcea13c40cd centos "/bin/bash" About a minute ago Up About a minute stoic_wilson
edbd9366d959 centos "/bin/bash" 7 minutes ago Up 7 minutes affectionate_bartik
[root@192 ~] docker exec -it edbd9366d959 /bin/bash ## 再次进入
[root@edbd9366d959 /]# exit ##停止并推出
exit
2.5 删除容器
# 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f
docker rm 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm
[root@192 ~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfcea13c40cd centos "/bin/bash" 29 minutes ago Up 29 minutes stoic_wilson
edbd9366d959 centos "/bin/bash" 35 minutes ago Up 35 minutes affectionate_bartik
9939864fa2e6 centos "bin/bash" 48 minutes ago Exited (0) 48 minutes ago unruffled_knuth
5f42e9930435 centos "/bin/bash" 52 minutes ago Exited (0) 49 minutes ago lucid_cannon
a89ddb393d3d bf756fb1ae65 "/hello" 20 hours ago Exited (0) 20 hours ago gracious_bhabha
[root@192 ~] docker rm 5f42e9930435
5f42e9930435
[root@192 ~] docker rm edbd9366d959 # 注意正在运行的容器不能删除
Error response from daemon: You cannot remove a running container edbd9366d9596c744dd449119269b04de2f2a494e7fc471f6396bcefd94c33fe. Stop the container before attempting removal or force remove
[root@192 ~] docker ps -aq # 所有容器id
bfcea13c40cd
edbd9366d959
9939864fa2e6
a89ddb393d3d
[root@192 ~]# docker rm -f $(docker ps -aq) # 全部删除
bfcea13c40cd
edbd9366d959
9939864fa2e6
a89ddb393d3d
2.6 启动和停止/杀死容器的操作
docker start
docker restart
docker stop
docker kill