在 Ubuntu 中部署 Docker 环境

使用的环境是 ubuntu 14.04 LTS x86_64

原文参考:https://docs.docker.com/engine/installation/ubuntulinux/

第一节:基础 Docker 部署

1. 先更新操作系统

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install aptitude
sudo aptitude update

2. 更新 apt 源

# 写入 gpg key
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

# 添加 apt 源
sudo cat <<EOF>/etc/apt/sources.list.d/docker.list
deb https://apt.dockerproject.org/repo ubuntu-trusty main
EOF

# 更新源
sudo apt-get update

# 清掉旧版本的库(如果有)
sudo apt-get purge lxc-docker

# 验证源
sudo apt-cache policy docker-engine

# 安装先决条件
sudo apt-get install linux-image-extra-$(uname -r)

注意这里实际执行的时候我遇到了一个问题,在执行第一句写入 gpg key 的时候:

> gpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.net
> ?: p80.pool.sks-keyservers.net: Host not found
> gpgkeys: HTTP fetch error 7: couldn't connect: Success
> gpg: no valid OpenPGP data found.
> gpg: Total number processed: 0

这种情况是因为 GFW 的问题导致这个域名解析不到:p80.pool.sks-keyservers.net

解决办法是翻墙出去 ping 这个地址,然后得到 IP,再回来将 ip 写到 hosts 里面,成功。

3. 执行安装

sudo aptitude install docker-engine

# 启动服务
sudo service docker start

第二节:LNMP 环境部署

首先,我们会在宿主机上面,根据实际需要的部件配置服务,但是所有服务的配置部分、文件部分都通过卷挂载的方式挂载宿主机的目录。

所以我们事先创建好后面所需要的外部文件目录:

# Nginx
sudo mkdir -p /var/docker/nginx/conf.d     # /etc/nginx/conf.d
sudo touch /var/docker/nginx/conf.d/default.conf

# MariaDB
mkdir -p /var/docker/mariadb/mysql    # /var/lib/mysql
mkdir -p /var/docker/mariadb/backups   # /var/backups 用于备份文件的导入导出

# php 实例
mkdir -p /var/docker/php-fpm/

1. MariaDB 部署

在我们部署 MariaDB 的时候,关键点有如下几个:

  1. 由于 MariaDB 实例部署在宿主机内部,我们用 --link 附加的形式进行访问,因此,我们将密码简单设置为 root,端口封闭;
  2. 我们通过卷附加的方式,将 MariaDB 的数据文件夹通过卷附加的形式到宿主机中;
MYSQL_PORT_3306_TCP_ADDR=127.0.0.1
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_ENV_MYSQL_ROOT_PASSWORD=root

sudo docker run \
  --name mariadb_main \
  --restart on-failure:10 \
  -v /var/docker/mariadb/mysql:/var/lib/mysql \
  -v /var/docker/mariadb/backups:/var/backups \
  -e MYSQL_ROOT_PASSWORD="$MYSQL_ENV_MYSQL_ROOT_PASSWORD" \
  -d mariadb:latest

如上,即创建了一个 MariaDB 实例容器。

如果需要进入 mysql 的命令环境,可以有两种方法:

1. 直接进入:
docker run -it --link mariadb_main:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
2. 通过进入宿主机的命令行:
sudo docker exec -it mariadb_main bash

# 进入之后,在 bash 环境下:
export TERM=linux  # 如果没有这句会提示 "TERM environment variable not set." 的错误
mysql -uroot -proot  # 根据实际的用户和数据库等进行指定

进入之后,我们后面可能免不了需要创建一些独立的用户和数据库,在 mysql 提示符下,创建用户和数据库的方式如下:

注意编码,这是以 wordpress 为例,使用了 utf8mb4 的编码,一般使用 utf8 也可以。

CREATE USER IF NOT EXISTS 'ws_site'@'%' IDENTIFIED BY 'ws_site_password';
CREATE DATABASE IF NOT EXISTS ws_site DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON ws_site.* TO 'ws_site'@'%';
FLUSH PRIVILEGES;

后面每部署一个 php 的 web 应用实例,均应独立创建用户和数据库。

2. Nginx 部署

同样需要特殊注意的配置项:

  1. 虚拟主机的配置目录 /etc/nginx/conf.d/ 是需要挂载到外部的宿主机中的;
  2. 端口 80 和 443 是直接桥接给宿主机的;
  3. 后面对于所有的 php 实例,需要通过 --link 附加到 fpm 的容器内部进行 fcgi 代理;
  4. 对于所有的 php 实例,整个代码文件夹以及额外的数据文件夹等都需要直接伺服,因为静态文件需要访问到;
  5. 关于容器之间的连接,参考:http://www.ituring.com.cn/article/199033?utm_source=tuicool
sudo docker run \
  --name nginx \
  --link php7 \
  --restart always \
  -v /var/docker/nginx/conf.d:/etc/nginx/conf.d \
  -v /var/docker/app:/var/www/html \
  -p 80:80 -p 443:443 \
  -d nginx:latest

注意由于 conf.d 是外部挂载的,所以默认情况下是没有配置文件的,这时候的 nginx 不能够马上跑起来。

3. PHP (fpm) 部署

注意的配置事项:

  1. 注意我们要将 fpm 的运行用户修改为 nobody;
  2. 对于整个 WordPress 源码文件夹,nobody 不可写;
  3. wp-config.phpwp-content 是从外部挂载的,只读;
  4. uploads 是外部挂载的,nobody 可以读写;
  5. 在创建实例之前,我们需要在 MariaDB 上面创建数据库;
  6. php 的模块需要手动安装;

关于卷加载:http://dockone.io/article/128

sudo docker run \
  --name php7 \
  --link mariadb_main:mysql \
  -d php:fpm \
  -v /docker/app:/var/www/html

【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2016/01/ubuntu14-docker.html【在 Ubuntu 中部署 Docker 环境】

发表评论

电子邮件地址不会被公开。 必填项已用*标注