docker常用知识记录

发布时间 2023-03-24 14:52:33作者: fdsimin

安装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