docker常用知识记录
安装docker(以contos8为例)
# 卸载老版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装docker基础包 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 # 设置阿里云docker仓库 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装最新版本docker yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 启动docker systemctl start docker # 查看docker状态 systemctl status docker
# 如果出现container.io版本过低的情况,可以到以下网站下载较高版本的rpm包
# https://download.docker.com/linux/centos/8/x86_64/stable/Packages/
docker镜像相关命令
# 查看所有镜像 docker images # 删除一个镜像 docker rmi <image_id/image_name> # 当一个镜像还在被停掉的容器使用的时候,需要加-f参数强制删除,如果这个容器还在运行状态,则无法强制删除,只能先停止容器再删除 docker rmi -f <image_id/image_name>
docker容器相关命令
# 展示所有运行状态的容器 docker ps # 展示所有容器,包括运行状态和停止状态 docker ps -a # 进入一个运行状态的容器 docker exec -it <container_id> /bin/bash # 启动或停止或重启容器 docker start/stop/restart <container_id>
启动一个容器
# 启动一个容器, 如果镜像中有ENTRYPOINT或者CMD,则可以不用写/bin/bash docker run -itd <image_id> /bin/bash # 启动容器时的常用参数 # https://docs.docker.com/engine/reference/commandline/run/ # -it 以交互式方式启动容器 # -d 让容器运行在后台 # -v 参数可以将主机中的目录或文件挂载到容器中 # -e 参数可以在容器中设置环境变量 # --network,设置容器的网络模式,host表示跟主机共享网络 bridge表示桥接模式 # --rm 退出容器时就会删掉这个容器 # --restart 容器重启的策略,可为always # --name 给容器命名 # --env-file 从文件中读取环境变量并设置到容器中 docker run -itd -v /share/code/test:/opt/code/ -e version=4.3.1 --network host --rm --name atest <image_id>
打包镜像
# 打包镜像,这种方式打包的镜像后面的load的时候,tag标签不会丢失 docker save -o /home/hpcadmin/ltest/test.tar test:v1 # 解压镜像 docker load < test.tar
docker cp的用法
# 文件或者目录都是一样的用法,容器的状态不影响cp的结果 # 将主机上的内容cp到容器中 docker cp test.txt 099065b98603:/home # 将容器里面的目录cp到主机上 docker cp 099065b98603:/home/test ./
将容器重新提交为一个镜像
docker commit 099065b98603 test:v2
dockerfile文件
- RUN 执行Linux命令
- FROM 拉取基础镜像
- ADD 将文件或者压缩包添加到镜像中,如果是压缩包的话会自动进行解压, 后面也可以跟URL,URL下载的压缩包不会被解压 (ADD --chown=myuser:mygroup --chmod=655 files* /data/)
- COPY 将文件或者压缩包添加到镜像中,如果是压缩包的话不会自动进行解压 (COPY --chown=myuser:mygroup --chmod=655 files* /data/)
- ENV 设置环境变量
- ARG 定义一个变量 USER ${username:-test} ARG username USER $username
- EXPOSE 暴露容器内端口
- VOLUME 创建一个具有指定名称的挂载点,并将其标记为持有来自本机主机或其他容器的外部挂载卷
- WORKDIR 工作目录,默认为 / ,相当于cd到这个目录下,路径不存在的话会被创建
- ENTRYPOINT 容器入口执行的命令,若docker run时后面再跟一个命令,则这个命令会跟在entrypoint的命令后面
- CMD 容器入口执行的命令,若docker run时后面再跟一个命令,则这个命令会覆盖掉CMD的命令
- LABEL 给镜像添加标签,如 (LABEL description="a test")
- USER 设置用户名(或 UID)和可选的用户组(或 GID)以用作当前阶段剩余部分的默认用户和组
- ONBUILD 后面跟任意一条docker命令,在根据dockerfile文件构建镜像的时候不会执行,但是再构建另外一个镜像并且以这个镜像为基础镜像的时候,会执行ONBUILD后面的命令
- STOPSIGNAL 发送到容器退出的系统调用信号 可以为SIGKILL 也可以为数字9
文件示例
FROM rockylinux:8.6.20227707 WORKDIR /code ADD /code/test.tar.gz /usr/share/test COPY /code/authselect /usr/share/authselect/vendor/nslcd/ RUN rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm RUN dnf install -y http://repos.openhpc.community/OpenHPC/2/EL_8/x86_64/ohpc-release-2-1.el8.x86_64.rpm RUN dnf install -y dnf-plugins-core RUN dnf config-manager --set-enabled powertools RUN authselect select nslcd with-mkhomedir --force #rabbitmq RUN mkdir /usr/rabbitmq \ && wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/8/rabbitmq-server-3.9.10-1.el8.noarch.rpm/download.rpm -O /usr/rabbitmq/rabbitmq-server-3.9.10-1.el8.noarch.rpm \ && wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.14/erlang-23.3.4.14-1.el8.x86_64.rpm -O /usr/rabbitmq/erlang-23.3.4.14-1.el8.x86_64.rpm \ && dnf install --nodocs -y /usr/rabbitmq/erlang-23.3.4.14-1.el8.x86_64.rpm /usr/rabbitmq/rabbitmq-server-3.9.10-1.el8.noarch.rpm \ && rm -rf /usr/rabbitmq/erlang-23.3.4.14-1.el8.x86_64.rpm /usr/rabbitmq/rabbitmq-server-3.9.10-1.el8.noarch.rpm RUN chmod 655 /opt/init && chmod 655 /opt/start ENV LICO_FILE_MANAGER_CONCURRENCY 20 ENV LICO_CONFLUENT_PROXY_CONCURRENCY 50 CMD ["/opt/start"]
docker build 构建镜像
# 如果当前目录下的dockerfile文件就叫Dockerfile docker build -t test:v1 . # 如果当前目录下的dockerfile是其他的名称 docker build -t test:v1 -f ./rabbit_dockerfile . # 命令后不要忘记有一个. 代表当前目录,build的时候会把当前目录的上下文环境都加入到docker daemon中,所以制作镜像时最好重新建一个目录,只将镜像里需要的文件和目录拷进来 # 也可以都以相对路径或者绝对路径的方式构建 docker build --no-cache -t test:v2 -f ./maria/Dockerfile ../maria
多阶段构建镜像
如果前后端都放在一个容器里面,则可以采用多阶段构建的方式,先把前端相关的代码编译出来,在后端的镜像中直接引用这个编译好的前端的dist文件
FROM node:16.19.1-alpine3.16 AS stage WORKDIR /opt/build COPY openlico-portal /opt/build/openlico-portal/ RUN cd openlico-portal \ && npm config set registry https://registry.npm.taobao.org/ \ && npm install \ && npm run build FROM rockylinux:8.6.20227707 COPY --from=stage /opt/build/openlico-portal/dist /usr/share/lico-portal COPY openlico-docker/authselect /usr/share/authselect/vendor/nslcd/ RUN rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm RUN dnf install -y http://repos.openhpc.community/OpenHPC/2/EL_8/x86_64/ohpc-release-2-1.el8.x86_64.rpm RUN dnf install -y dnf-plugins-core RUN dnf config-manager --set-enabled powertools