Dockerfile
Dockerfile 是实现自定镜像的一种手段,通过编写 Dockerfile,来编译成自己想要的镜像。
FROM {image_name}:{image_tag} # 指定基础镜像
MAINTAINER {userinfo} # 维护人信息
USER {username} # 指定 RUN、CMD 或 ENTRYPOINT 运行时使用的用户
WORKDIR {workdir} # 为后续 RUN、CMD 或 ENTRYPOINT 运行指定工作目录
ENV {key} {value} # 为后续的 RUN 指令提供一个环境变量
RUN {bash command} # 要执行的命令,RUN 一次镜像叠加一次(大小),多个命令可以用 && 连接,以免镜像太大
ADD {local_file|dir} {container_dir} # 将本地文件/目录拷贝到容器的某个目录里,local_file|dir 可以是本地文件,也可以是一个 URL
COPY {local_file} {container_file} # 将本地文件拷贝到容器,不支持 URL
EXPOSE {ports} # 指定要映射的端口,可以写多个。需配合 -P 参数使用,即启动容器时加上 -P 参数,如果想知道你个具体的映射端口,可以用 -p 指定
VOLUME ["{local_dir}"] # 创建一个可以从本机或其他容器挂载的挂载点
CMD ["command", "param1", "param2"] # 指定容器启动时用到的命令,只能有一条!
ENTRYPOINT ["command", "param1", "param2"] # 指定容器启动时用到的命令,类似 CMD,只能写一条,不同的是:CMD 可以被 docker run 指令覆盖,而 ENTRYPOINT 不可以被覆盖
Dockerfile 示例:
FROM centos
MAINTAINER afei [email protected]
RUN yum update && yum install -y net-tools python3 gcc
ADD http://nginx.org/download/nginx-1.23.2.tar.gz /usr/local/src/
RUN cd /usr/local/src && tar zxvf nginx-1.23.2.tar.gz && mkdir -p /usr/local/nginx
RUN cd nginx-1.23.2 && ./configure --prefix=/usr/local/nginx && make && make install
COPY index.html /usr/local/nginx/html/index.html
COPY index2.html /usr/local/nginx/html/index2.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;" # 确保服务前台启动,如果将服务放到后台,容器会终止
Tips:docker 容器默认会把容器内部第一个进程,也就是 pid=1
的程序作为docker容器是否正在运行的依据,如果docker容器中 pid=1
的进程挂了,那么 docker 容器便会直接退出,也就是说 Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
编译镜像:
$ docker build -t {iamge_name}:{image_tag} -f /path/to/Dockerfile {workdir} # -f:指定要使用的 Dockerfile 文件路径;workdir:指定当前命令运行的工作目录
docker-compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。在 Compose 中,可以使用YAML 文件来配置应用程序的服务。然后,运行一条命令,即可从配置中创建并启动所有服务。使用 Compose 可在一台主计算机上方便地协调多个容器映像。
安装 docker-compose
安装:https://dockerdocs.cn/compose/install
$ curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose version # 检查安装结果
docker-compose.yaml
docker-compose.yaml 示例:
version: '3'
services:
wp: # 服务名称
image: wordpress:latest # 镜像版本
ports:
- ${IP}:${PORT}:80 # 端口映射
volumes:
- ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
- ./wp-app:/var/www/html # Full wordpress project
environment: # 环境配置
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: "${DB_NAME}"
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: "${DB_ROOT_PASSWORD}"
depends_on: # 服务依赖关系,会先启动被依赖的服务
- db
links:
- db
db: # 服务名称
image: mysql:latest # 镜像版本
ports:
- ${IP}:3306:3306 # 端口映射
command: [
'--default_authentication_plugin=mysql_native_password',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
volumes:
- ./wp-data:/docker-entrypoint-initdb.d
- db_data:/var/lib/mysql # 数据持久化
environment:
MYSQL_DATABASE: "${DB_NAME}"
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
volumes:
db_data:
使用 docker-compose.yaml,操作命令:
$ docker-compose up -d # 在 docker-compose.yaml 文件所在目录执行
$ docker-compose --help # 查看 docker-compose 命令使用方法,使用 docker-compose 命令管理容器需要进入到项目对应的 docker-compose.yaml 所在目录执行