前言
必读
示例安装时的环境如下:
系统版本:CentOS Linux release 7.8.2003 (Core)
本文使用dnf代替yum来进行安装包管理
至于为什么用dnf不用yum,主要是因为dnf在包管理这块比yum优秀。
安装dnf及相关插件
yum install dnf dnf-plugins-core dnf-plugin-config-manager -y
Docker CE安装
Step 1: 安装必要的一些系统工具
dnf install -y yum-utils device-mapper-persistent-data lvm2
Step 2: 添加软件源信息
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Step 3: 更新源缓存
dnf clean all && dnf makecache
Step 4: 安装Docker-CE
安装最新版本
dnf -y install docker-ce
安装指定版本
官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
修改源
vim /etc/yum.repos.d/docker-ee.repo
将[docker-ce-test]下方的enabled=0修改为enabled=1
查找版本
# yum list docker-ce.x86_64 --showduplicates | sort -r
将会看到类似如下信息:
[root@localhost yum.repos.d]# yum list docker-ce.x86_64 --showduplicates | sort -r
* updates: ftp.sjtu.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
* extras: ftp.sjtu.edu.cn
docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.11-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.10-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
* base: mirrors.aliyun.com
Available Packages
安装
dnf -y install docker-ce-版本
如:
dnf -y install docker-ce-17.03.2.ce-1.el7.centos
请注意查询时中间那列就是版本
Step 5: 开启Docker服务
service docker start
Step 6: 设置开机启动
dnf -y install docker-ce && service docker start && chkconfig docker on
step 7: 配置docker加速器
创建或修改 /etc/docker/daemon.json文件
阿里云,可参考https://cr.console.aliyun.com/cn-shanghai/instances/mirrors,阿里云提供了对应的命令
{
"registry-mirrors": [
"https://dkwyo9z1.mirror.aliyuncs.com"
]
}
腾讯云
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
加载配置并重新启动 Docker 服务
systemctl daemon-reload && systemctl restart docker
Step 8: 测试
docker run hello-world
您将看到如下输出信息,代表测试通过,docker的安装没有问题:
[root@localhost docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
[root@localhost docker]#
安装应用环境
必读
镜像仓库:https://hub.docker.com/
安装nginx
docker pull nginx:1.19.0
安装php-fpm
docker pull php:7.4.7-fpm
安装mysql
docker pull mysql:8.0.20
安装redis
docker pull redis:6.0.5
安装RabbitMQ
docker pull rabbitmq:3.9.5
配置环境
查看现有docker镜像及版本
docker image ls
启动mysql容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123qweASD+ --name test_mysql mysql:8.0.20
参数说明:
-d
让容器在后台运行-p
添加主机到容器的端口映射-e
设置环境变量,这里设置mysql的root用户的初始密码-name
容器的名称、只要求唯一性
启动php-fpm容器
docker run -d -v /var/nginx/www/html:/var/www/html -p 9000:9000 --link test_mysql:mysql --name test_php_fpm php:7.4.7-fpm
参数说明:
-d
让容器在后台运行-p
添加主机到容器的端口映射-v
添加目录映射,主机上的/var/nginx/www/html映射到容器里面 的/var/www/html,如果主机没有这个目录就创建这个目录,或者映射别的目录,但是后面路径要统一-name
容器的名称、只要求唯一性-link
容器与另外一个容器建立联系,这样就可以在当前的容器去使用另一个容器里的服务
启动nginx容器
docker run -d -p 80:80 --name test_nginx -v /var/nginx/www/html:/var/www/html --link test_php_fpm:php --name test_nginx nginx:1.19.0
参数说明
-d
让容器运行在后台-p
添加主机到容器的端口映射-v
添加目录映射,这里最好nginx容器的根目录最好写成和php容器中根目录一样。但是不一定非要一样,如果不一样在配置nginx的时候需要注意-name
容器的名称、只要求唯一性-link
容器与另外一个容器建立联系,这样就可以在当前的容器去使用另一个容器里的服务
安装php扩展
step1:登录php-fpm容器
通过以下命令查看CONTAINER ID
即容器ID
docker container ls
此时终端会列出已经安装到容器如下:
[root@localhost html]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc072250a56b php:7.4.7-fpm "docker-php-entrypoi…" 14 seconds ago Up 13 seconds 0.0.0.0:9000->9000/tcp test_php_fpm
a14f569a4d46 mysql:8.0.20 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp test_mysql
[root@localhost html]#
第一列即为CONTAINER ID
即容器ID
,示例中我安装了2个镜像(php:7.4.7-fpm,mysql:8.0.20),我们需要登录的是php:7.4.7-fpm
,通过查看,php:7.4.7-fpm
的CONTAINER ID
为bc072250a56b
,容器的登录命令为:
docker exec -it
CONTAINER ID
/bin/bash
因此,通过以下命令即可登录示例中的php:7.4.7-fpm容器:
docker exec -it bc072250a56b /bin/bash
step2:安装需要的扩展
安装php官方扩展
官方扩展涵盖以下这些:
bcmath bz2 calendar ctype curl dba dom enchant exif ffi fileinfo filter ftp gd gettext gmp hash iconv imap intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer xml xmlreader xmlrpc xmlwriter xsl zend_test zip
以上扩展可以通过登录php-fpm容器运行如下命令,进行安装:
docker-php-ext-install
插件名称
多个插件同时安装用空格隔开如:
docker-php-ext-install
插件名称1
插件名称2
插件名称3
比如我需要php-fpm容器支持mysql,那么我需要安装pdo
、pdo_mysql
、 mysqlnd
、mysqli
,一条命令同时安装这4个扩展就是:
docker-php-ext-install pdo pdo_mysql mysqlnd mysqli
安装php-redis扩展
登录php-fpm容器运行:
pecl install redis
运行过程有点慢,不用着急,稍等片刻。
出现如下信息:
root@bc072250a56b:/var/www/html# pecl install redis
downloading redis-5.2.2.tgz ...
Starting to download redis-5.2.2.tgz (251,629 bytes)
.....................................................done: 251,629 bytes
29 source files, building
running: phpize
Configuring for:
PHP Api Version: 20190902
Zend Module Api No: 20190902
Zend Extension Api No: 320190902
enable igbinary serializer support? [no] :
enable lzf compression support? [no] :
enable zstd compression support? [no] :
一直回车即可,成功安装后将看到如下终端输出:
#以上信息省略
Build complete.
Don't forget to run 'make test'.
running: make INSTALL_ROOT="/tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2" install
Installing shared extensions: /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local/lib/php/extensions/no-debug-non-zts-20190902/
running: find "/tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2" | xargs ls -dils
101283173 0 drwxr-xr-x. 3 root root 17 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2
67551581 0 drwxr-xr-x. 3 root root 19 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr
101283174 0 drwxr-xr-x. 3 root root 17 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local
14124 0 drwxr-xr-x. 3 root root 17 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local/lib
34782891 0 drwxr-xr-x. 3 root root 24 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local/lib/php
67551582 0 drwxr-xr-x. 3 root root 39 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local/lib/php/extensions
101283175 0 drwxr-xr-x. 2 root root 22 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local/lib/php/extensions/no-debug-non-zts-20190902
101283176 3476 -rwxr-xr-x. 1 root root 3556344 Jun 24 07:59 /tmp/pear/temp/pear-build-defaultuserIQ8jvj/install-redis-5.2.2/usr/local/lib/php/extensions/no-debug-non-zts-20190902/redis.so
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20190902/redis.so'
install ok: channel://pecl.php.net/redis-5.2.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=redis.so" to php.ini
root@bc072250a56b:/var/www/html#
接下来运行如下命令,启用redis支持
docker-php-ext-enable redis
通过如下命令你可以查看扩展是否已经安装成功:
php -m
运行后终端将会列出所有已经安装的扩展:
root@bc072250a56b:/var/www/html# docker-php-ext-enable redis
root@bc072250a56b:/var/www/html# php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
redis
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib
[Zend Modules]
root@bc072250a56b:/var/www/html#
部署应用
由于docker下官方提供的nginx镜像去除了除nginx运行所需的命令以外的其他命令,因此直接登录容器配置默认情况下是不行的,因此我们需要通过宿主机进行配置,然后放到docker容器中,具体操作方法如下:
step1:查看nginx的CONTAINER ID
容器ID
docker container ls
终端输出如下:
[root@localhost html]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b36d3d47fa3 nginx:1.19.0 "/docker-entrypoint.…" 52 minutes ago Up 52 minutes 0.0.0.0:80->80/tcp test_nginx
bc072250a56b php:7.4.7-fpm "docker-php-entrypoi…" About an hour ago Up About an hour 0.0.0.0:9000->9000/tcp test_php_fpm
a14f569a4d46 mysql:8.0.20 "docker-entrypoint.s…" 3 hours ago Up 3 hours 0.0.0.0:3306->3306/tcp, 33060/tcp test_mysql
[root@localhost html]#
根据上述信息可知,nginx的CONTAINER ID
:8b36d3d47fa3
step2:复制docker中的默认配置到宿主机
docker cp 8b36d3d47fa3:/etc/nginx/conf.d/default.conf /opt/
step3:修改默认配置
vi /opt/default.conf
server {
listen 80;
server_name localhost;
location / {
root /var/www/html; #修改这里默认的路径
index index.html index.htmi index.php; #这里加入添加php的方式
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root html;
fastcgi_pass bc072250a56b:9000; #这里可以用容器ID,也可以用容器IP,都具备唯一性,建议用容器ID,本章示例中,php-fpm的容器ID为:bc072250a56b
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; #修改这里的路径
include fastcgi_params;
}
}
step4:导入默认配置
docker cp /opt/default.conf 8b36d3d47fa3:/etc/nginx/conf.d/default.conf
step5:重新加载nginx配置
登录nginx容器
docker exec -it 8b36d3d47fa3 /bin/bash
测试配置是否正常
nginx -t
加载配置
nginx -s reload
看到如下信息代表nginx配置加载成功:
root@8b36d3d47fa3:/# nginx -s reload
2020/06/24 09:14:36 [notice] 92#92: signal process started
root@8b36d3d47fa3:/#
真实项目部署案例:
待续……