docker

容器命令: ``` 进入容器:docker exec -it my_container /bin/bash ``` ``` 查看日志: docker logs -f pid ``` # dockerfile详解 DockerFile是用来构建Docker镜像的文本文件,其中包括了一条条构建镜像所需要的指令和参数。 * [指令介绍]() * * [FROM]() * 功能为指定基础镜像,并且必须是第一条指令。 * ``` FROM <image> FROM <image>:<tag> FROM <image>:<digest> 三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest ``` * [MAINTAINER]() * 指定作者 (新版docker中使用LABEL指明) * ``` MAINTAINER <name> ``` * [LABEL]() * 为镜像指定标签 (一个Dockerfile种可以有多个LABEL) * ``` LABEL version="1.0" LABEL description="description." ``` * [ADD]() * 把文件复制到镜像中。 * 路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,推荐写成绝对路径 * 可以是一个本地文件或者是一个本地压缩文件,还可以是一个url * 如果把写成一个url,那么ADD就类似于wget命令 * ``` ADD test mcmdDir/ ADD test /proj ADD http://example.com/foobar / ``` * [COPY]() * COPY的只能是本地文件,其他与add用法一致 * ``` COPY <src>... <dest> ``` * [EXPOSE]() * 暴漏容器运行时的监听端口给外部。但是EXPOSE并不会使容器访问主机的端口。如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数 * ``` EXPOSE <port>/<tcp/udp> ``` * [ENV]() * 设置环境变量 多个用 \ 隔开 * ``` ENV ENV_VAR_1=value1 \ ENV_VAR_2=value2 \ ENV_VAR_3=value3 ``` * [RUN]() * 通过 `RUN` 可以执行任何可执行文件或脚本,例如安装依赖包、运行编译器、打包应用程序等操作,这些都会被记录下来,并成为新的镜像层。 * 每个 `RUN` 指令都会生成一个新的镜像层,因此在使用 `RUN` 时应该尽量将多个命令合并到一个 `RUN` 中,这有助于减小镜像大小。 * 多个命令用&& 分隔,换行用 \ 分隔 * ``` RUN npm install \ && npm run serve ``` * [CMD]() * 为容器启动时默认命令或参数 * [RUN&amp;&amp;CMD]() * [ENTRYPOINT]() * [VOLUME]() * 可以将宿主机目录挂载到容器中 (三种语法) * ``` VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db ``` * [USER]() * 设置启动容器的用户,可以是用户名或UID * 如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行,使用这个命令一定要确认容器中拥有这个用户,并且拥有足够权限 * ``` USER daemo USER UID ``` * [WORKDIR]() * 设置工作目录,如果不存在则会创建,也可以设置多次 * ``` WORKDIR /test1 WORKDIR test2 ``` * [ARG]() * [ONBUILD]() * [STOPSIGNAL]() * [HEALTHCHECK]() 以下dockerfile是一个使用例子: ``` # Dockerfile中使用OpenJDK 11镜像作为基础镜像 FROM openjdk:11-jdk-slim # 设置工作目录 WORKDIR /app # 将宿主机上的应用程序jar文件复制到容器中 COPY target/*.jar app.jar # 暴露容器端口(此处为8080) EXPOSE 8080 # 容器启动时运行以下命令 CMD ["java", "-jar", "app.jar"] ``` 在使用 Docker 构建镜像时,Docker 引擎会默认查找名为“Dockerfile”的文件作为构建上下文的说明文件。但实际上你可以通过 `-f`参数来指定其他名称的 Dockerfile 文件,例如: ``` docker build -t myapp:1.0 -f mydockerfile . ``` # docker-compose详解 以下docker-compose是一个使用例子: 3306:3306 前面的是属主机的端口,后面的是容器内部的端口 * restart=always 开机启动 ``` version: "3.5" services: mcmCloud-mysql: image: mysql:8.0 container_name: mcm-mysql restart: always environment: - MYSQL_ROOT_PASSWORD=123456 ports: - 3306:3306 volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d - ./mysql/initsql:/docker-entrypoint-initdb.d - mcMcloud-redis: image: redis:6.2 container_name: mcmCloud-redis restart: always ports: - 6379:6379 ``` 执行下命令进行构建: ``` docker-compose up ``` # docker注册为系统服务自启动 在Ubuntu 22.04中,使用systemd将Docker注册为系统服务的步骤与之前版本略有不同。 以下是具体步骤: 1. 创建一个docker.service文件 在 `/etc/systemd/system/`路径下创建一个名为 `docker.service`的文件,并添加以下内容: ``` [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com/ After=network-online.target docker.socket firewalld.service Requires=docker.socket [Service] Type=notify ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity TimeoutStartSec=0 Restart=on-abnormal [Install] WantedBy=multi-user.target ``` 这个文件描述了如何启动Docker服务。 2. 重新加载systemd配置 执行以下命令以重新加载systemd配置文件: ``` sudo systemctl daemon-reload ``` 3. 启动Docker服务 执行以下命令启动Docker服务: ``` sudo systemctl start docker ``` 4. 验证是否启动成功 运行以下命令验证Docker服务是否已经成功启动: ``` sudo systemctl status docker ``` 如果Docker服务已经启动,您会看到类似于以下输出: ``` ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2021-08-23 22:06:33 CST; 7s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com/ Main PID: 20875 (dockerd-current) Tasks: 11 Memory: 166.6M CPU: 2.904s CGroup: /system.slice/docker.service ├─20875 /usr/bin/dockerd-current -H fd:// --containerd=/run/containerd/containerd.sock └─20885 /usr/bin/docker-containerd-current -l unix:///run/containerd/containerd.sock --metrics-interval=0 ... Aug 23 22:06:32 docker systemd[1]: Starting Docker Application Container Engine... Aug 23 22:06:33 docker dockerd-current[20875]: time="2021-08-23T22:06:33.193030442+08:00" level=info msg="Starti... Aug 23 22:06:33 docker dockerd-current[20875]: time="2021-08-23T22:06:33.193201511+08:00" level=info msg="API li... Aug 23 22:06:33 docker systemd[1]: Started Docker Application Container Engine. ``` 5. 设置自动启动 使用以下命令将Docker注册为系统启动服务: ``` sudo systemctl enable docker ``` 现在,在Ubuntu中,每次启动系统时,Docker都会自动启动。 完成上述步骤后,您应该已经成功地将Docker注册为Ubuntu的系统服务。