启动容器
1.命令行(docker run)
一般用于独立运行的容器(不向其他容器提供服务),或临时运行的容器
docker run -d -it \
--entrypoint [path] \
--name [container-name] \
--hostname 主机名 \
--restart always \
--rm \
-e TZ=Asia/Shanghai \
--user [UID:PID] \
-v [local/file/path]:[container/file/path] \
-p [dest-port]:[src-port-in-docker] \
-w [work directory] \
[the-image-you-will-run] [cmd-command]
-d
Run container in background and print container ID-it
进入交互模式并分配tty--entrypoint
与[cmd-command]可结合使用--name
container name。用于管理Docker容器--hostname
主机名。用于标识Docker容器中运行的应用程序--restart
设置是否自动重启--rm
容器退出时自动删除实例-e
如果是运行在服务器上,需要将时区的环境变量设置成中国时区,否则会默认使用UTC时区--user
指定容器运行时的用户,例如--user $(id -u):$(id -g)
-v
挂载数据卷 必须保证主机上的挂载目录或文件存在!!!-p
端口映射-w
指定工作目录,即“当前目录”cmd-commond
如果有多个命令时,需要用sh -c
,命令用双引号扩起来,例如:sh -c "cd dir && python app.py"
2.docker-compose.yml
一般用于为其他容器提供服务的容器,容器实例运行后会被其他容器访问,如:数据库服务、邮件服务......
示例
services:
mariadb:
container_name: mariadb
image: mariadb
restart: always
volumes:
- $PWD/volume:/var/lib/mysql
environment:
- TZ=Asia/Shanghai
- MARIADB_ROOT_PASSWORD=DMwA1oEucnOxGVmjuqoXGmI4Q0jrUO7BBhQlE4B9
ports:
- "18686:3306"
❗注意:docker-compose启动后,会自动创建一个
[docker-compose.yml所在的目录名]_default
的网络
更多命令可查看docker-compose配置文档:https://docs.docker.com/compose/compose-file/05-services/
启动/暂停 docker compose
# 启动,测试阶段可不加-d,方便定位错误信息
docker compose up -d
# 暂停
docker compose down
# 进入容器
cd [docker-compose.yml所在目录]
docker compose exec -it [service-name] bash
Dockerfile配置
FROM
MAINTAINER
RUN
构建镜像执行的命令,每一次RUN都会构建一层ENTRYPOINT
容器进入时执行的命令CMD
容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数- 推荐exec模式,运行效率高。但如果要使用shell中的某个特殊字符,就必须要用shell模式运行,比如管道符
|
、通配符*
和变量$
等# exec模式 # 用中括号扩起来不经过shell解释器,直接运行命令 CMD ["gunicorn","-b","127.0.0.1:8000","app:app"] # shell模式 # 命令会被shell解释器进程执行,用ps命令可以看到shell是父进程,而我们要运行的命令是fork的子进程 CMD ./alist server
- 推荐exec模式,运行效率高。但如果要使用shell中的某个特殊字符,就必须要用shell模式运行,比如管道符
VOLUME
将容器内的某个目录定义为数据卷。容器运行时,如果用户没有挂载这个目录,docker就会用匿名的目录进行挂载,实现挂载的目录持久化存储。- 示例代码
# 容器启动后会挂载这个数据卷 VOLUME /app/data # 运行容器时需要将容器内的数据卷挂载到本地 -v /local/path:/app/data # 如果容器内指定了VOLUME,但是docker run时没有用-v参数进行映射,那么docker会在宿主机创建一个匿名的目录与容器内的VOLUME路径进行映射
匿名数据卷在容器被删除时并不会自动删除,除非手动执行
docker volume prune
命令清理所有未被使用的卷。因此,最好在启动容器时使用命名卷(named volume)或绑定挂载(bind mount),以便在容器被删除时卷也能被删除,从而避免潜在的存储空间占用和安全问题
- 示例代码
USER
指定执行的用户组和用户WORKDIR
切换当前执行的工作目录HEALTHCHECH
健康检测指令EXPOSE
暴露端口ARG
在构建镜像时,给镜像传递参数# 譬如,在构建镜像时,指定MY_NAME变量 docker build --build-arg MY_NAME=John -t my-image . # 在镜像内部使用MY_NAME变量 ARG MY_NAME ENV MY_NAME ${MY_NAME} RUN echo "My name is ${MY_NAME}"
ENV
给容器内部设置环境变量ENV MY_NAME=John
ADD
添加文件,如果是压缩文件也解压COPY
添加文件,以复制的形式
根据Dockerfile构建镜像
docker build -t [name:tag] .
# 例如
docker build -t playwright-agent:1.0 .
-t
Name and optionally a tag in the name:tag.
Dockerfile in current directory,otherwith you have to specify a Dockerfile use-f
根据image镜像反推Dockerfile文件
docker history --no-trunc [IMAGE_NAME]
其他常用命令
容器运行状态查看
# 类似linux中的ps命令
docker ps
# 查看每个容器的cpu和内存还有网络情况
docker stats
# 查看容器内部的进程
docker top [CONTAINER]
删除容器/删除镜像
# 删除容器
docker rm -f [container_name]
# 删除镜像
docker rmi -f [image_name_or_id]
清理 cleanup
docker system prune -a --volumes
Alpine镜像
安装软件包
apk add --no-cache
软件包镜像加速 清华源镜像
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
进入容器
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS是可选的选项,包括:
-d
启用守护模式。-i
保持STDIN打开,即使未附加。-t
分配一个伪TTY。-u
指定要使用的用户或UID。-e
设置环境变量。
# 执行nginx容器的sh命令并分配tty
docker exec -it nginx sh
# 执行多条命令
docker exec -it mycontainer sh -c "command1 && command2"
查看容器内的运行日志
docker logs [OPTIONS] CONTAINER
可选参数
--details
Show extra details provided to logs-f, --follow
Follow log output
加入到其他网络
docker network connect [network_name] [container_name]
作用:使A容器可以访问到另一个网络的B容器实例,docker自带dns解析,用[container_name]或是静态IP均可访问
判断容器之间网络是否互通
nc -zv playwright-agent 3000
这个命令会尝试连接到名为 playwright-agent 的容器的 3000 端口。如果连接成功,nc 会返回一条消息,表示端口开放并且可访问。
如果端口未开放或无法访问,nc 会返回一个错误消息,说明连接失败