Docker

CentOS Docker安装

CentOS7要求64位,且内核版本高于3.10

查看CentOS内核版本:uname -r

· 安装Docker:卸载旧版本

1
2
3
4
5
6
7
8
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

· 安装所需软件包

1
2
3
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

· 设置Docker仓库(清华源)

1
2
3
$ sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

· 安装Docker Engine-Community

1
$ sudo yum install docker-ce docker-ce-cli containerd.io

启动Docker

1
$ sudo systemctl start docker

通过运行自带的hello-world镜像来验证是否正确安装了Docker

1
$ sudo docker run hello-world

运行应用程序

使用docker run命令在容器内运行一个脚本

1
$ docker run centos /bin/echo "hello docker"

其中centos为指定要运行的镜像。Docker 会先从本地主机上查找镜像是否存在,如果不存在,则到Docker Hub镜像仓库下载公共镜像

运行交互式容器

使用docker命令的两个参数 -i -t 实现对运行容器的交互

· -t:在新的容器内指定一个伪终端或终端

· -i:允许对容器内的标准输入(STDIN)进行交互

1
$ docker run -i -t centos /bin/bash

运行 exit 命令或者使用键盘CTRL+D退出该容器

后台模式运行容器

使用下列命令创建一个以进程方式运行的容器

1
$ docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"

执行后并没有输出”hello world”,而是输出了一串字符(容器ID),可以通过该容器ID来查看对应的容器里执行了什么

执行docker ps命令查看运行的容器,其中:

· CONTAINER ID :容器ID

· IMAGE:使用的镜像

· COMMAND:启动容器时执行的命令

· CREATED:容器创建时间

· STATUS:容器状态(created:已创建;restarting:重启中;running/Up:运行中;removing:迁移中;paused:暂停中;exited:已停止;dead:死亡)

· PORTS:端口信息和使用的连接类型(tcp\udp)

· NAMES:自动分配的容器名称

要查看容器内部的标准输出,执行docker logs <CONTAINER ID>

停止容器

1
$ docker stop <CONTAINER ID>

Docker 容器

获取镜像

假设本地没有ubuntu镜像,使用docker pull命令来载入一个ubuntu镜像

1
$ docker pull ubuntu

启动容器

1
$ docker run -it ubuntu /bin/bash

查看全部容器

1
$ docker ps -a

启动停止运行的容器

1
2
$ docker ps -a # 获取容器ID
$ docker start <CONTAINER ID>

后台运行容器

-d可以指定容器的运行模式

1
$ docker run -itd --name ubuntu-test ubuntu /bin/bash

停止容器

1
$ docker stop <CONTAINER ID>

重启容器

1
$ docker restart <CONTAINER ID>

进入容器

使用了-d参数后,容器进入后台运行,此时需要进入容器,需要指令docker attachdocker exec

其中docker attach命令下如果容器退出,则容器会停止,而docker exec命令会退出容器终端,但不会导致容器的停止

1
2
$ docker attach <CONTAINER ID>
$ docker exec -it <CONTAINER ID> /bin/bash

导出与导入容器

导出容器:导出本地某个容器

1
$ docker export <CONTAINER ID> > centos.tar

导入容器:将容器快照文件导入到镜像

1
$ cat docker/centos.tar | docker import - test/centos:v1

或通过指定URL/目录来导入

1
$ docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

1
$ docker rm -f <CONTAINER ID>

清理所有处于终止状态的容器:

1
$ docker container prune

Docker镜像

运行容器时,使用的镜像如果在本地中不存在,docker会自动从docker镜像仓库中下载。默认Docker Hub公共镜像源

获取Docker镜像

1
$ docker images

其中:

· REPOSITORY :镜像仓库源

· TAG:镜像标签

· IMAGE ID:镜像ID

· CREATED:镜像创建时间

· SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如python仓库源里,有3.6.7、3.9.0两个不同的版本了。使用 <REPOSITORY> : <TAG> 来定义不同的镜像

例:使用3.9.0版本的pythob来运行容器,执行:

1
$ docker run -it python:3.9.0 /usr/bin/env python

镜像后的/usr/bin/env python是具体的命令,这里的作用是启动交互式python IDLE。如果不指定镜像的版本标签,docker将默认使用python:latest镜像

查找镜像

1
$ docker search centos

其中:

· NAME :镜像仓库源名称

· DESCRIPTION:镜像描述

· STARS:点赞数

· OFFICIAL:是否为Docker官方发布镜像

· AUTOMATED:自动构建

预加载镜像

当在本地主机当中使用不存在的镜像时Docker将会自动下载镜像。如果要预加载镜像,可以使用docker pull命令

1
$ docker pull centos:7

下载完成后,就可以直接使用这个镜像运行容器

删除镜像

1
$ docker rmi <IMAGE ID>

创建自己的镜像

· 从已创建容器当中更新镜像

通过镜像进入一个容器

1
$ docker run -it centos:7 bin/bash

例:安装vim

1
$ yum install vim

执行exit命令退出容器,接着使用docker commit命令提交容器副本

1
$ docker commit -m="add vim" -a="9.9" <CONTAINER ID> centos7:vim

其中:

· -m :镜像描述信息

· -a:镜像作者

· CONTAINER ID:容器ID

· centos7:镜像名称

· vim:镜像标签

启动安装vim的镜像容器

1
$ docker run -it centos:vim /bin/bash

· 使用Dockerfile构建镜像

使用docker build命令,构建一个全新的镜像。需要在自定目录下创建Dockerfile文件,并添加构建指令

1
2
3
4
5
6
7
FROM python:3.9.0
ADD fastapi /
WORKDIR /
RUN /usr/local/bin/python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
RUN pip install fastapi[all] -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
EXPOSE 8089
CMD ["python","main.py"]

1
$ docker images

使用构建的镜像创建容器

1
$ docker run -it -p 8089:8089 fastapi:v1.0

设置镜像标签

1
$ dcoker tag <IMAGE ID> <REPOSITORY>:<TAG>
1
$ dcoker tag 8720FB78CF34 fastapi:v1.1

为已有标签的镜像添加标签,该镜像将共用两个标签而不会被替换

运行应用示例

启动应用

载入并运行镜像,其中-P命令使容器内部使用的网络端口随机映射到主机上

1
2
$ docker pull training/webapp
$ docker run -d -P training/webapp python app.py

1
$ docker ps

可以通过-p参数来设置端口

1
$ docker run -d -p 5000:5000 training/webapp python app.py

查看容器内端口的指令:

1
$ docker port <CONTAINER ID>

查看应用程序日志/进程:

1
2
$ docker logs -f <CONTAINER ID>
$ docker top <CONTAINER ID>

查看Docker应用底层信息:

1
$ docker inspect

停止应用容器

1
$ docker stop <CONTAINER ID>

重启应用容器

对停止的应用:docker start

对运行中的应用:docker restart

查询最后一次创建的容器:docker ps -l

1
2
docker start 707a9f61dd9a
docker ps -l

移除应用容器

:容器必须是停止状态

1
$docker rm <CONTAINER ID>




### Docker网络端口映射

以fastapi镜像为例

· -P:随机映射

1
$ docker run -it -P <REPOSITORY>:<TAG> ...


· -p:指定端口映射、指定容器绑定的ip地址

1
$ docker run -it -p 8089:8089 <REPOSITORY>:<TAG> ...


1
$ docker run -it -p 127.0.0.1:8089:8089 <REPOSITORY>:<TAG> ...


默认都是绑定tcp端口,如要绑定UPD协议端口,需要在端口后加上\udp
1
$ docker run -it -p 127.0.0.1:8089:8089/udp <REPOSITORY>:<TAG> ...

· port:快速查看端口绑定情况

1
$ docker port <CONTAINER ID> <PORT>

指定容器名称、用户:

1
$ docker run -it -p 127.0.0.1:8089:8089 --name fastapi --user=root <REPOSITORY>:<TAG> ...

Dockerfile

Dockerfile是用于构建镜像的文本文件,其中包含了构建镜像时需要用到的各个指令和说明

Dockerfile的指令每执行一次都会在docker上新建一层镜像,如果执行过多会脏成镜像膨胀过大,例如之前的fastapi镜像

1
2
3
4
5
6
7
FROM python:3.9.0
ADD fastapi /
WORKDIR /
RUN /usr/local/bin/python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
RUN pip install fastapi[all] -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
EXPOSE 8089
CMD ["python","main.py"]

可以将其修改为:

1
2
3
4
5
6
7
FROM python:3.9.0
ADD fastapi /
WORKDIR /
RUN /usr/local/bin/python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn \
&& pip install fastapi[all] -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
EXPOSE 8089
CMD ["python","main.py"]

&&符号连接的命令,在执行后只会构建一层镜像

构建命令

1
$ docker build -t <REPOSITORY>:<TAG> .

最后.代表本次执行的上下文路径(打包本机目录下文件的全部内容)

Dockerfile常用构建指令

· COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径

1
COPY [--chown=<user>:<group>][<source>,... <target>]
1
COPY fastapi /

其中:

· [–chown=<user>:<group>] :可选参数,用户改变复制到容器内文件的拥有者和属组

· <source>:源文件或源目录

· <targer>:目标路径,容器内的指定路径,如果不存在则会自动创建

· ADD

与COPY使用方法类似,主要用于执行的源文件为tar压缩文件情况下,会自动复制并解压到目标路径中

· CMD

1
2
3
CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

运行程序,在执行docker run时执行

· ENTRYPOINT

1
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

执行docker run时接受命令行参数,但在命令行指定了 –entrypoint 时,将覆盖ENTRYPOINT指令指定的程序,且如果存在多个,仅有最后一个生效

· WORKDIR

指定工作目录。用WORKDIR指定的工作目录,会在构建镜像的每一层中都存在(WORKDIR指定的工作目录,必须是提前创建好的)

docker build构建镜像过程中的,每一个RUN命令都是新建的一层。只有通过WORKDIR创建的目录才会一直存在

1
WORKDIR <工作目录路径>

· EXPOSE

声明端口。在运行时使用随机端口映射时,执行docker run -P,会自动随机映射EXPOSE的端口

1
EXPOSE <端口1> [<端口2>...]

· ENV

设置环境变量

1
2
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

· ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量

构建命令 docker build 中可以用 –build-arg <参数名>=<值> 来覆盖

1
ARG <参数名>[=<默认值>]

· VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,用于避免重要的数据因容器重启而丢失、避免容器体积不断变大。在执行docker run时,可以通过-v参数修改挂载点

1
2
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

· USER

指定执行后续命令的用户和用户组,用于切换后续命令执行的用户(用户和用户组必须提前已经存在)

1
USER <用户名>[:<用户组>]

· HEALTHCHECK

指定某个程序或者指令来监控 docker 容器服务的运行状态

1
2
3
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

· ONBUILD

用于延迟构建命令的执行。就是 Dockerfile 里使用ONBUILD指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的Dockerfile使用了之前构建的镜像FROM test-build ,这时执行新镜像的Dockerfile构建时候,会执行test-build的Dockerfile里ONBUILD指定的命令

1
ONBUILD <其它指令>

· LABEL

LABEL 指令以键值对的形式给镜像添加一些元数据(metadata)

1
LABEL <key>=<value> <key>=<value> <key>=<value> ...

Docker打包

打包tar

1
$ docker save -o <filename> <REPOSITORY>:<TAG>
1
$ docker save -o fastapi.tar fastapi:v1.0

加载tar

1
$ docker load < fastapi.tar

进入容器内部

编辑容器

运行一个容器

1
$ docker run -d -P <REPOSITORY>:<TAG>

进入容器内部

1
$ docker exec -it <CONTAINER ID> [bash]/[/bin/sh]/[/bin/bash]

退出容器内部

1
$ quit

复制容器内代码文件

1
$ docker cp <CONTAINER ID>:/file/path/within/container /root/path/target

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2024 青域 All Rights Reserved.

UV : | PV :