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&&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的系统服务。