前言 众所周知、Docker已经成为了开发者必会的技能之一,也成为家庭软路由、NAS的必装之一。大家都知道了它的优点,所以我不多叙述。说一个我使用它的原因,我有四个工作环境,两个Windows、两个MacOS、一个CentOS。仅为了每次 git clone
后不想因为装依赖而抓狂。本文会用一个NGINX
+PHP
的环境给大家提供思路,有了思路,其他环境也是一样的搭建,没有难度,有些手把手的内容就略了。
介绍
镜像 Docker 镜像(Image),就相当于是一个 root 文件系统
容器 容器的实质是进程。 容器内的进程是运行在一个隔离的环境里,容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。 容器消亡时,任何保存于容器存储层的信息都会随容器删除而丢失。所以容器不应该向其存储层内写入任何数据,官方推荐使用数据卷
Docker Registry 如果我们要使用他人的镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
安装Docker 略~, 不过提一点,如果你的主机在国内最好安装之后的第一件是配置一下镜像加速器,提供3个参考
1 2 3 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址) 网易云加速器 https://hub-mirror.c.163.com 百度云加速器 https://mirror.baidubce.com
Docker 命令 装完之后就可以使用 docker 命令了,比如docker ps
docker images
docker build
等,详见官方文档 Docker command line
ps:可以借助我的 Chrome破解小插件 更好的帮助大家阅读英文文档
比如运行一个Ubuntu
镜像
1 $ docker run -it --rm ubuntu:18.04 bash
然而并没有什么用,很多第三方的包括官方的图形化操作都可以让你忘却这些命令,什么情况会用到这些命令呢,举一个例子,安装一个speedtest
,大可不必写Dockerfile
1 2 3 4 // run 会自动下载安装 adolfintel/speedtest 镜像 // -p 主机的8888端口映射到容器80端口 // -d 后台运行容器 docker run -p 8888:80 -d adolfintel/speedtest
学习docker如果到止步于此就太可惜了,后面的才是精华。
Dockerfile 命令行的方式肯定是满足不了我们的需求的,使用Dockerfile
迫在眉睫,Dockerfile
其实也是几个命令行的事情,其中的单词命令也不需要死记.
常用的指令 后面如果用到每个指令会详细讲解
ps:Dockerfile 中每一个指令都会建立一个新的镜像,下一个指令就是在上一个指令新建的镜像上面执行。如果哪天遇到了刚装的NODE、NPM 提示 not found 记得回来看这个提示。
FROM 指定基础镜像
RUN 执行命令
COPY 复制文件
ARG 构建参数
ENV 设置环境变量
WORKDIR 指定工作目录
…
练手1 我们来定一个需求,一个带有git环境的ubuntu镜像。通个这个需求就可以得到一个思路,写其他的dockerfile也是八九不离其中。
Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 FROM ubuntu:rollingRUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list RUN apt update && \ apt-get install -y git && \ apt-get clean
以上就是实现了我们的小需求了,比如安装 curl
就信手拈来了。
练手2 有两种情况下,我们会用到 Dockerfile
,其一就是配合docker-compose
,其二就是docker build
。其一后面说,其二你必须知道,这是基础。 Dockerfile:
1 2 3 4 FROM nginxCOPY ./package.json /var/www/
构建镜像
1 2 3 docker build nginx:v3 .
你可以使用 docker run 去运行容器了
终极奥义 Docker Compose Compose
项目是 Docker
官方的开源项目,负责实现对 Docker
容器集群的快速编排Compose
定位是 「定义和运行多个 Docker
容器的应用」 · 必须使用 Dockerfile
Mac、Windows 自带 docker-compose 二进制文件
常见命令
build 构建(重新构建)项目中的服务容器
ports 主机端口映射到容器
restart 重启项目中的服务
volumes
depends_on 解决容器的依赖、启动先后的问题
expose 暴露端口,但不映射到宿主机,只被连接的服务访问
networks 配置容器连接的网络
pid 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作
NGINX + PHP 先说一下我们的思路,我们需要两个Dockerfile
,两个容器需要在一个网络,NGINX
可以和 PHP
通信,默认同一个网络,可以自定义。 目录结构如下
1 2 3 4 5 6 - docker |- php-fpm |- Dockerfile |- nginx |- Dockerfile |- docker-compose.yml
docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 version: '3.9' services: php-fpm: build: context: ./php-fpm volumes: - ./php-fpm/php.ini:/usr/local/etc/php/php.ini expose: - "9000" restart: unless-stopped nginx: build: context: ./nginx ports: - "80:80" - "443:443" args: - PHP_UPSTREAM_CONTAINER=php-fpm - PHP_UPSTREAM_PORT=9000 volumes: - [项目目录 ]:/var/www - ./nginx/log:/var/log/nginx - ./nginx/default.conf:/etc/nginx/sites-available - ./nginx/ssl:/etc/nginx/ssl depends_on: - php-fpm restart: unless-stopped
NGINX:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 FROM nginx:stable-alpineCOPY nginx.conf /etc/nginx/ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories RUN apk update \ && apk upgrade \ && apk --update add logrotate \ && apk add --no-cache openssl \ && apk add --no-cache bash RUN apk add --no-cache curl RUN set -x ; \ addgroup -g 82 -S www-data ; \ adduser -u 82 -D -S -G www-data www-data && exit 0 ; exit 1 ARG PHP_UPSTREAM_CONTAINER=php-fpmARG PHP_UPSTREAM_PORT=9000 RUN touch /var/log/messages COPY logrotate/nginx /etc/logrotate.d/ RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER} :${PHP_UPSTREAM_PORT} ; }" > /etc/nginx/conf.d/upstream.conf \ && rm /etc/nginx/conf.d/default.conf ADD ./startup.sh /opt/startup.sh RUN sed -i 's/\r//g' /opt/startup.sh CMD ["/bin/bash" , "/opt/startup.sh" ] WORKDIR /var/www EXPOSE 80 443
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 FROM php:7.4 -fpmRUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN set -xe; \ apt-get update -yqq && \ pecl channel-update pecl.php.net && \ apt-get install -yqq \ apt-utils \ gnupg2 \ git \ libzip-dev zip unzip && \ docker-php-ext-configure zip && \ docker-php-ext-install zip && \ php -m | grep -q 'zip' pecl install -o -f redis \ && rm -rf /tmp/pear \ && docker-php-ext-enable redis \ WORKDIR /var/www CMD ["php-fpm" ] EXPOSE 9000
完。