最近想在把博客迁移到docker上,本想图省事的看了许多网上的博客,照着做了做,不是少着就是缺那,就重新写了compose.yml , 并把具体步骤整理了下,方便以后使用。
安装环境:
# 在一台初始的 阿里云 ECS 上,未做其他设置 [root mcabana 22:10:12] ~ -- $ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root mcabana 22:10:15] ~ -- $ uname -a Linux mcabana.node.example 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux [root mcabana 22:10:18] ~ -- $ docker -v Docker version 19.03.8, build afacb8b [root mcabana 22:10:21] ~ -- $
安装的版本:nginx 1.7.0,php 7.3.5,mysql 5.7.29
1.0 docker安装
1.0.1 使用yum 仓库直接安装
cd /etc/yum.repos.d/
# yum 安装可以使用阿里yum源,这样安装包下载会很快
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 也可以使用官方源 wget https://download.docker.com/linux/centos/docker-ce.repo
# 然后直接安装即可
yum install -y docker-ce systemctl start docker systemctl enable docker
# 查看docker版本
docker --version
/etc/yum.repos.d -- $ docker --version Docker version 19.03.8, build afacb8b
1.0.2 docker配置阿里镜像加速
https://cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors
mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://hsrkaqbh.mirror.aliyuncs.com"], "dns": ["223.6.6.6","223.5.5.5"], "data-root": "/data/docker" } EOF # data-root 是设置docker的数据存储目录,可以单独建立一个分区 sudo systemctl daemon-reload sudo systemctl restart docker
这样可以提升获取docker官方镜像的速度。
1.1 docker compose 安装
# 先安装pip yum -y install epel-release yum -y install python-pip
# 检查pip版本 [root mcabana 17:13:11] /etc/yum.repos.d -- $ pip --version pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
pip install --upgrade pip [root mcabana 17:13:11] /etc/yum.repos.d -- $ pip --version pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
# 安装docker compose pip install docker-compose
查看版本:
docker-compose version
# 出现报错
此时需要升级setuptools
pip install --upgrade setuptools
1.2 docker compose 构建项目
目录结构:
mkdir -p /data/mcabana/{nginx,php,mysql}/{conf,log,data}
-- $ tree /data/mcabana/ /data/mcabana/ ├── mysql │ ├── conf │ ├── data │ └── log ├── nginx │ ├── conf │ ├── data │ └── log └── php ├── conf ├── data └── log 12 directories, 0 files
1.2.1 关于php安装
php需要安装libzip,这个需要单独装,所以先准备 libzip-1.5.2 和cmake-3.15.7的源码文件。另外php的拓展是通过docker-php-ext-enable 和 pecl安装的, 所以需要更改 php 容器的npm源 sources.list,不然连接ubuntu的官方源,速度极慢。
创建文件目录:
mkdir /data/mcabana/php/build-file cd /data/mcabana/php/build-file # 将下载的文件放到这个目录 wget --no-check-certificate https://share.mcabana.com/share/php7.3.5/cmake-3.15.7.tar.gz wget --no-check-certificate https://share.mcabana.com/share/php7.3.5/sources.list wget --no-check-certificate https://share.mcabana.com/share/php7.3.5/libzip-1.5.2.tar.gz
准备php的Dockerfile
# 这个dockerfile文件最好先复制到notepad++,然后在复制到服务器,以免出现格式问题。 FROM php:7.3.5-fpm COPY ./build-file/sources.list /etc/apt/sources.list COPY ./build-file/libzip-1.5.2.tar.gz /usr/local/src/ COPY ./build-file/cmake-3.15.7.tar.gz /usr/local/src/ RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && >/etc/apt/sources.list.d/buster.list RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ libmemcached-dev \ zlib1g-dev \ libcurl4-openssl-dev \ libxml2-dev \ libmagickwand-dev \ libmagickcore-dev \ --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN cd /usr/local/src/ \ && tar xvf libzip-1.5.2.tar.gz \ && tar xvf cmake-3.15.7.tar.gz \ && cd cmake-3.15.7 \ && ./bootstrap \ && make \ && make install \ && cd /usr/local/src/libzip-1.5.2 \ && mkdir build \ && cd build \ && cmake .. \ && make \ && make install RUN pecl install imagick \ && pecl install mcrypt-1.0.2 \ && docker-php-ext-enable mcrypt \ && docker-php-ext-enable imagick RUN docker-php-ext-install -j$(nproc) \ iconv gettext curl mysqli pdo pdo_mysql zip \ mbstring bcmath opcache xml simplexml sockets hash soap \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd RUN cd /usr/local/etc/php \ && mv php.ini-production php.ini \ && echo "extension=mcrypt.so" >>php.ini \ && echo "extension=imagick.so" >>php.ini CMD ["php-fpm", "-F"]
1.3 准备docker compose 文件
# 这里定义的mysql的root密码是123456安装完成后记得改。 [root mcabana 18:08:45] /data/mcabana -- $ cd /data/mcabana/ [root mcabana 18:08:52] /data/mcabana -- $ cat docker-compose.yml version: "3" services: mysql: hostname: mysql restart: always image: mysql:5.7 container_name: mysql ports: - "3306:3306" volumes: - mysql-config:/etc/mysql - mysql-log:/var/log/mysql - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_USER: www MYSQL_PASSWORD: user123 php: hostname: php restart: always container_name: php build: context: ./php dockerfile: Dockerfile ports: - "9000:9000" links: - mysql:mysql volumes: - nginx-html:/var/www/html - php-config:/usr/local/etc nginx: hostname: nginx restart: always container_name: nginx image: nginx:1.17.0 ports: - "80:80" - "443:443" links: - "php:php" volumes: - nginx-config:/etc/nginx - nginx-log:/var/log/nginx - nginx-html:/usr/share/nginx/html volumes: mysql-config: mysql-log: mysql-data: nginx-html: php-config: nginx-config: nginx-log:
# 现在的目录结构是这样的 [root mcabana 18:10:24] /data/mcabana -- $ pwd /data/mcabana [root mcabana 18:10:25] /data/mcabana -- $ tree . ├── docker-compose.yml ├── mysql │ ├── conf │ ├── data │ └── log ├── nginx │ ├── conf │ ├── data │ └── log └── php ├── build-file │ ├── cmake-3.15.7.tar.gz │ ├── libzip-1.5.2.tar.gz │ └── sources.list ├── conf ├── data ├── Dockerfile └── log 13 directories, 5 files [root mcabana 18:10:26] /data/mcabana
1.4 运行docker compose
[root mcabana 18:11:49] /data/mcabana -- $ cd /data/mcabana/ [root mcabana 18:11:53] /data/mcabana -- $ docker-compose up
# 已经在下载镜像了
其中安装php中,需要编译安装插件,会比较慢!!!
2.0 项目结构
安装完成后,输入docker ps, 可以看到运行了三个容器 php,nginx,mysql
可以通过docker exec -it php bash 分别进行登录。
2.0.1 关于数据持久化
这次的安装,使用的是docker volume,将容器内的目录映射成了一个个卷组,在docker官方的介绍中volume的方式是优于 bind mount 。volume如下:
如果要查看卷具体信息可使用:
这种卷组使用的本地文件存储,此外开可以使用nfs,tmpfs,进行挂载。
创建volume时并没有指定宿主机路径,为了方便使用可以建立一些软连接
# nginx 配置文件 rm -rf /data/mcabana/nginx/data ln -s /data/docker/volumes/mcabana_nginx-html/_data /data/mcabana/nginx/data [root mcabana 20:41:24] /var/lib -- $ ll /data/mcabana/nginx/data/ total 8 -rw-r--r-- 1 root root 494 May 21 2019 50x.html -rw-r--r-- 1 root root 612 May 21 2019 index.html [root mcabana 20:41:32] # nginx 日志文件 rm -rf /data/mcabana/nginx/log ln -s /data/docker/volumes/mcabana_nginx-log/_data /data/mcabana/nginx/log [root mcabana 20:45:01] /var/lib -- $ ll /data/mcabana/nginx/log/ total 0 lrwxrwxrwx 1 root root 11 Jun 11 2019 access.log -> /dev/stdout lrwxrwxrwx 1 root root 11 Jun 11 2019 error.log -> /dev/stderr [root mcabana 20:45:12] # nignx 配置文件 rm -rf /data/mcabana/nginx/conf ln -s /data/docker/volumes/mcabana_nginx-config/_data /data/mcabana/nginx/conf [root mcabana 20:46:35] /var/lib -- $ ll /data/mcabana/nginx/conf/ total 40 drwxr-xr-x 2 root root 4096 Mar 21 20:23 conf.d -rw-r--r-- 1 root root 1007 May 21 2019 fastcgi_params -rw-r--r-- 1 root root 2837 May 21 2019 koi-utf -rw-r--r-- 1 root root 2223 May 21 2019 koi-win -rw-r--r-- 1 root root 5231 May 21 2019 mime.types lrwxrwxrwx 1 root root 22 May 21 2019 modules -> /usr/lib/nginx/modules -rw-r--r-- 1 root root 643 May 21 2019 nginx.conf -rw-r--r-- 1 root root 636 May 21 2019 scgi_params -rw-r--r-- 1 root root 664 May 21 2019 uwsgi_params -rw-r--r-- 1 root root 3610 May 21 2019 win-utf [root mcabana 20:46:45]
# php 配置文件 rm -rf /data/mcabana/php/conf ln -s /data/docker/volumes/mcabana_php-config/_data /data/mcabana/php/conf [root mcabana 21:20:07] /var/lib -- $ ll /data/mcabana/php/conf/ total 28 -rw-r--r-- 1 root ftp 1195 May 8 2019 pear.conf drwxr-sr-x 3 root ftp 4096 Mar 21 20:23 php -rw-r--r-- 1 root ftp 5346 May 8 2019 php-fpm.conf -rw-r--r-- 1 root ftp 5351 May 8 2019 php-fpm.conf.default drwxr-sr-x 2 root ftp 4096 Mar 21 20:23 php-fpm.d [root mcabana 21:20:10]
# mysql 配置文件 rm -rf /data/mcabana/mysql/* ln -s /data/docker/volumes/mcabana_mysql-config/_data /data/mcabana/mysql/conf ln -s /data/docker/volumes/mcabana_mysql-data/_data /data/mcabana/mysql/data ln -s /data/docker/volumes/mcabana_mysql-log/_data /data/mcabana/mysql/log [root mcabana 21:22:21] /var/lib -- $ ll /data/mcabana/mysql/ total 0 lrwxrwxrwx 1 root root 47 Mar 21 21:21 conf -> /data/docker/volumes/mcabana_mysql-config/_data lrwxrwxrwx 1 root root 45 Mar 21 21:22 data -> /data/docker/volumes/mcabana_mysql-data/_data lrwxrwxrwx 1 root root 44 Mar 21 21:22 log -> /data/docker/volumes/mcabana_mysql-log/_data [root mcabana 21:22:30]
安装完成后,就是进行测试了~
3.0 结果测试
3.0.1 nignx 测试
检查服务器安全组,防火墙,放行80 , 443 端口,然后浏览器访问80端口
3.0.2 测试php
首先要改下nginx配置文件,添加上php的转发
# 删除默认配置文件 rm -f /data/mcabana/nginx/conf/conf.d/default.conf vi /data/mcabana/nginx/conf/conf.d/www.conf # 写入内容 server { listen 80; client_max_body_size 20m; location / { root /usr/share/nginx/html/www/; index index.php index.html; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /var/www/html/; fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # 测试下添加的文件语法是否正确 docker exec -it nginx nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # 如果没问题,就reload配置 docker exec -it nginx nginx -s reload 2020/03/21 13:28:44 [notice] 17#17: signal process started
写一个php测试文件
[root mcabana 21:33:40] /var/lib -- $ cat /data/mcabana/nginx/data/test_php.php <?php phpinfo(); ?> # 添加执行权限 [root mcabana 21:33:49] -- $ chmod +x /data/mcabana/nginx/data/test_php.php
浏览器访问IP/test_php.php
出现这个php info 页面,nignx 连接 php 就算基本成功了。
3.0.3 测试php 连接 mysql
# 写一个php 连接mysql的脚本,放到网站目录下 vi /data/mcabana/nginx/data/test_mysql.php <?php $servername = "mysql"; $username = "root"; $password = "123456"; // 创建连接 $conn = new mysqli($servername, $username, $password); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功"; ?> chmod +x /data/mcabana/nginx/data/test_mysql.php
至此,nignx 连接 php mysql 就基本完成了,要删除 测试文件
rm -f /data/mcabana/nginx/data/test_*
3.1 修改容器时区
这里用的官方镜像中的时区需要改为上海时区,不然会导致日志中的时间慢八个小时
[root mcabana 22:02:57] ~ -- $ docker exec -it nginx bash root@nginx:/# echo 'Asia/Shanghai' > /etc/timezone root@nginx:/# cat /etc/timezone Asia/Shanghai root@nginx:/# exit exit [root mcabana 22:06:00] ~ -- $ docker exec -it mysql bash root@mysql:/# echo 'Asia/Shanghai' > /etc/timezone root@mysql:/# cat /etc/timezone Asia/Shanghai root@mysql:/# exit exit # php 的时区在Dockerfile中已经更改了,这里不需要修改。
3.2 关于php-fpm 7.3.5 镜像中的npm源修改问题
在官方镜像中默认使用的是debian的官方源,在国内连接速度极慢,通常做法就是修改为国内源比如 阿里源,清华源。
看了许多网上的文章,基本上都是修改 /etc/apt/sources.list 文件,将里面的debian替换掉,这种做法其实并不全面,我试验了几次,还是会连接debian官方源,原因在于/etc/apt/sources.list.d/ 这个目录下还有一个 buster.list 文件,里面记录的也是debian源,在执行 apt-get update 时,容器还是会读取这个文件,并且连接。
我平常并不使用apt也不清楚为什么会这样,总之清空或替换 /etc/apt/sources.list.d/ buster.list 文件后,就不会有干扰了。
4.0 使用脚本管理
为了方便使用,用shell脚本来控制docker-compose的启停。
为了分类管理,脚本放到这里了
https://www.hugbg.com/archives/1482.html
2020-03-28 8:13 下午 1F
数星星的孩子,是在和夜晚的星空交谈,而不是为了得到一个数字。 —来自网络
2020-03-30 12:29 下午 2F
如果不能忠于自己的心,胜负又有什么价值呢? —塔希里亚故事集