docker 使用
帮助命令:
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker命令--help #帮助命令
镜像命令
docker images查看所有本地的主机上的镜像
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的
idCREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --a11 #列出所有镜像
-q,--quiet #只显示镜像的id
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@d77ccb2e5cca:/#
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:14.04 /bin/bash
root@39e968165990:/#
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
docker search 搜索镜像
image-20210927141316736可选项,通过搜藏来过滤
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
[root@sd-vm-0002863 ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11470 [OK]
mariadb MariaDB Server is a high performing open sou… 4354 [OK]
获取一个新的镜像
下载镜像docker pu1l 镜像名[:tag]
[root@sd-vm-0002863 ~]# docker pu1l mysq1
Using default tag: latest #如果不写tag,默认就是latest
latest: Pu1ling from library /mysq1
5b54d594fba7: Pu1l complete #分层下载,docker iamge的核心联合文件系统
07e7d6a8a868: Pu17 complete
abd946892310: Pu17 complete
dd8f4d07efa5: Pu17 complete
....
删除镜像
镜像删除使用 docker rmi 命令
[root]# docker rmi -f 镜像id #删除指定的镜像
[root]# docker rmi -f 镜像id 镜像id 镜像id 镜像id #删除多个镜像
[root]# docker rmi -f $(docker images -aq)#删除全部的镜像
删除镜像时,遇到一个小 bug
[root@sd-vm-0002863 makeMirror]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yu/centos7 zhuaYJ 2e9a4f24b361 About an hour ago 1.8GB
yjz/centos7 zhuaYJ 64ed56076ed8 3 hours ago 1.61GB
删除 yjz/centos7:zhuaYJ 镜像,使用命令
docker rmi -f 64ed56076ed8
报错:
Error response from daemon: conflict: unable to delete 64ed56076ed8 (cannot be forced) - image has dependent child images
解决方法:
docker rmi -f yjz/centos7:zhuaYJ
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
1. 更新镜像
更新镜像之前,先看看我已有的镜像:
image-20210927145709135我们需要使用已有的镜像来创建一个容器。已有的镜像是:centos:centos7.5.1804
docker run -it --name zhuaYJ centos:centos7.5.1804 /bin/bash
在运行的容器内使用 一系列的安装程序运行的环境 命令进行更新。
在完成操作之后,输入**ctrl+q+p **命令来退出这个容器。
查看容器运行:
docker ps
可以看到,此时 ID 为 df98b86d0305的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
docker commit -m="爬虫环境" -a="yu" df98b86d0305 yu/centos7:zhuaYJ
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- df98b86d0305:容器 ID
- yu/centos7:zhuaYJ: 指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 yu/centos7:zhuaYJ:
image-20210927201103350使用我们的新镜像 yu/centos7 来启动一个容器
$ docker run -it yu/centos7:zhuaYJ /bin/bash
2. 构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
[root@sd-vm-0002863 makeMirror]# cat Dockerfile
FROM centos:centos7.5.1804
RUN yum -y install wget gcc make openssl-devel bzip2-devel \
expat-devel gdbm-devel readline-devel sqlite-devel \
mysql-devel gcc-devel python-devel xz-devel
RUN mkdir -p /home/python \
&&wget -P /home/python https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz \
&&tar -zxvf /home/python/Python-3.6.5.tgz -C /home/python \
&&cd /home/python/Python-3.6.5 \
&&./configure --prefix=/usr/local/python && make && make install \
&&ln -s /usr/local/python/bin/python3 /usr/bin/python3 \
&&ln -s /usr/local/python/bin/pip3 /usr/bin/pip3 \
&&rm -rf /home/python
RUN yum install -y libSM-1.2.2-2.el7.x86_64 --setopt=protected_multilib=false
RUN yum install -y libXrender-0.9.10-1.el7.x86_64 --setopt=protected_multilib=false
RUN yum install -y libXext-1.3.3-3.el7.x86_64 --setopt=protected_multilib=false
ENV PATH="/usr/local/python/bin:$PATH"
WORKDIR /app
COPY ./requirements2.txt /app
RUN /usr/bin/python3 -m pip install --upgrade pip\
&& pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements2.txt \
&& pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl
RUN sed -i "s/f.attrs\['backend'\].decode('utf8')/f.attrs['backend'].encode('utf-8').decode('utf8')/g" /usr/local/python/lib/python3.6/site-packages/keras/engine/saving.py\
&& sed -i "s/f.attrs\['keras_version'\].decode('utf8')/f.attrs['keras_version'].encode('utf-8').decode('utf8')/g" /usr/local/python/lib/python3.6/site-packages/keras/engine/saving.py
RUN yum install kde-l10n-Chinese -y && \
yum install glibc-common -y && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LC_ALL zh_CN.UTF-8
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
docker build -f Dockerfile -t yu/detection:centos7 .
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为30c03e9457df
[root@sd-vm-0002863 fs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yu/detection centos7 30c03e9457df 9 minutes ago 1.88GB
yu/centos7 zhuaYJ 2e9a4f24b361 3 hours ago 1.8GB
mycentos cs_centos05 aca138064121 30 hours ago 1.77GB
python 3.7 24f00312f661 2 weeks ago 903MB
continuumio/anaconda3 2020.11-alpine 8a4c5d6cd346 9 months ago 2.44GB
hello-world latest bf756fb1ae65 21 months ago 13.3kB
centos centos7.5.1804 cf49811e3cdb 2 years ago 200MB
purposefly/anaconda latest 90550a2ddede 4 years ago 2.13GB
我们可以使用新的镜像来创建容器
docker run -it yu/detection:centos7 /bin/bash
# 或 下面是加端口号映射
docker run -it -p 5000:5000 yu/detection:centos7
从上面看到新镜像已经包含我们创建的用户 yu。
3. 设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
root@sd-vm-0002863 fs:~$ docker tag 30c03e9457df yu/detection:dev
docker tag 镜像ID,这里是 30c03e9457df,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为30c03e9457df的镜像多一个标签。
相当于复制了一份镜像
容器命令
获取镜像
如果我们本地没有 centos镜像,我们可以使用 docker pull 命令来载入 centos镜像:
$ docker pull centos:centos7.5.1804
启动容器
以下命令使用 centos 镜像启动一个容器,参数为以命令行模式进入该容器:
docker run [可选参数]image
#参数说明
--name="Name" 容器名字centos01 centos02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
实例-测试:
# 测试,启动进入容器内部
[root@sd-vm-0002863 ~]# docker run -it centos:centos7.5.1804 /bin/bash
[root@0e5c2b05338b /]# ls #查看容器内的centos,基础版本,很多命令都是不完善的!
bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
# 从容器退回主机
[root@0e5c2b05338b /]# exit
exit
[root@sd-vm-0002863 ~]#
启动已停止运行的容器
查看所有的容器命令如下:
#docker ps命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
[root@sd-vm-0002863 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e5c2b05338b centos:centos7.5.1804 "/bin/bash" 22 minutes ago Exited (0) 11 minutes ago adoring_khayyam
[root@sd-vm-0002863 ~]# docker ps -aq
0e5c2b05338b
使用 docker start 启动一个已停止的容器:
$ docker start 0e5c2b05338b
[root@sd-vm-0002863 ~]# docker start 0e5c2b05338b
0e5c2b05338b
停止一个容器
停止容器的命令如下:
$ docker stop <容器 ID>
[root@sd-vm-0002863 ~]# docker stop 0e5c2b05338b
0e5c2b05338b
$ docker kill <容器 ID> # 强制停止容器
停止的容器可以通过 docker restart 重启:
$ docker restart <容器 ID>
image-20210928165844144
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
[root@sd-vm-0002863 ~]# docker run -itd --name myCentos7 centos:centos7.5.1804 /bin/bash
f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712
image-20210928170121720
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)。
退出容器
exit # 直接容器停止并退出
ctrl + P+Q # 容器不停止退出
删除容器
docker rm 容器id #册除指定的容器,不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach
- docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
attach 命令
下面演示了使用 docker attach 命令。
[root@sd-vm-0002863 ~]# docker attach f9b697b06ef6
image-20210928172701885
注意: 如果从这个容器退出,会导致容器的停止。
exec 命令
下面演示了使用 docker exec 命令。
[root@sd-vm-0002863 ~]# docker exec -it f9b697b06ef6 /bin/bash
[root@f9b697b06ef6 /]# exit
exit
[root@sd-vm-0002863 ~]#
注意: 如果从这个容器退出,容器也会停止,
----------如果想退出,容器不停止请使用:ctrl + P+Q
推荐大家使用 docker exec 。
更多参数说明请使用 docker exec --help 命令查看。
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
导出容器 f9b697b06ef6 快照到本地文件 centos7.2.tar。
[root@sd-vm-0002863 rongqi_tar]# docker export f9b697b06ef6 > centos7.2.tar
[root@sd-vm-0002863 rongqi_tar]# ls
centos7.2.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件centos7.2.tar 导入到镜像 test/ubuntu:v1:
[root@sd-vm-0002863 rongqi_tar]# cat /**/rongqi_tar/centos7.2.tar | docker import - test/centos:7.2
sha256:f0edac5673848b61ea948ac09978b4d2937493507c1c21032f4e282f5772450c
# 查看一下
[root@sd-vm-0002863 rongqi_tar]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos 7.2 f0edac567384 About a minute ago 314MB
此外,也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo
常用其他命令
# 1.镜像
docker pull centos:centos7.5.1804 # 为镜像添加一个新的标签
docker images
docker rmi -f 镜像id #删除指定的镜像
docker tag 30c03e9457df yu/detection:dev
# 2.容器
docker run -it --name zhuaYJ centos:centos7.5.1804 /bin/bash # 后台运行
docker run -it yu/centos7:zhuaYJ /bin/bash # 后台运行
docker run -itd --name myCentos7 centos:centos7.5.1804 /bin/bash # 但是不进入后台
exit # 直接容器停止并退出
ctrl + P+Q # 容器不停止退出
docker commit -m="爬虫环境" -a="yu" df98b86d0305 yu/centos7:zhuaYJ # 更新镜像
docker build -f Dockerfile -t yu/detection:centos7 . # 构建镜像
docker stop <容器 ID> # 停止容器
docker start <容器 ID> # 启动容器
docker restart <容器 ID> # 重启容器
# 删除容器
docker rm 容器id #册除指定的容器,不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
# 进入容器
docker exec -it f9b697b06ef6 /bin/bash
# 容器打包
docker export f9b697b06ef6 > centos7.2.tar # 导出
cat /**/rongqi_tar/centos7.2.tar | docker import - test/centos:7.2 # 导入
# 3. 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径 # 反之亦然
docker cp ./ana-centos/ 9434e87c6674:/app/
# 4. 查看日志
docker logs -f -t --tai1 容器,没有日志
docker logs -f 616d8365708e
# 5. 查询最后一次创建的容器
docker ps -l
查看镜像的元数据
命令:
docker inspect 容器id
[root@sd-vm-0002863 rongqi_tar]# docker inspect f9b697b06ef6
[
{
"Id": "f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712",
"Created": "2021-09-28T09:00:26.66510206Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 13442,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-09-28T09:29:09.791239858Z",
"FinishedAt": "2021-09-28T09:26:29.821490536Z"
},
"Image": "sha256:cf49811e3cdb94cbdfd645f3888d7add06a315449cf2c7ca7b81c312f1e46c63",
"ResolvConfPath": "/var/lib/docker/containers/f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712/hostname",
"HostsPath": "/var/lib/docker/containers/f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712/hosts",
"LogPath": "/var/lib/docker/containers/f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712/f9b697b06ef6ac07da5616cde7fe28427e5eedae4f98e679c61a528765a4a712-json.log",
"Name": "/myCentos7",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
运行一个 web 应用
命令:
docker build -f Dockerfile -t yu/detection:centos7 .
docker run -it -p 5000:5000 yu/detection:centos7
使用 docker ps 来查看我们正在运行的容器:
[root@sd-vm-0002863 rongqi_tar]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9b697b06ef6 centos:centos7.5.1804 "/bin/bash" 4 hours ago Up 4 hours myCentos7
616d8365708e yu/detection:centos7 "/bin/bash" 24 hours ago Up 24 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp optimistic_bouman
这里多了端口信息。
PORTS
0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口,这时我们可以通过浏览器访问WEB应用
网友评论