最近在学docker,先拿本身的博客来开下刀[手动狗头]。
我是根据这个教程来安装的:Centos安装Docker。步骤以下:php
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
sudo yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast sudo yum install docker-ce
sudo yum install docker-ce
这一步可能会报错:containerd.io (>= 1.2.2-3)
,此时须要先安装新版本的containerd.io
html
yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
最新的containerd.io版本请在https://download.docker.com/linux/centos/7/x86_64/stable/Packages/找(国内直接安装containerd.io可能会很是慢致使安装失败,建议能够想办法将rpm包下载到本机再安装)。安装完containerd.io后再sudo yum install docker-ce
便可。mysql
sudo systemctl enable docker sudo systemctl start docker
docker run hello-world
vi /etc/docker/daemon.json
(该文件不存在时请新建)linux
{ "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com" ] }
保存后重启服务nginx
sudo systemctl daemon-reload sudo systemctl restart docker
mkdir -p /data/mariadb docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test --mount type=bind,source=/data/mariadb,target=/var/lib/mysql --restart=always --name mariadb mariadb
--mount
命令也能够用-v /data/mariadb:/var/lib/mysql --name mariadb mariadb
代替,官方更推荐使用--mount
,详情请看 官网。
参数说明:git
-p IP:host_port:container_port
/var/lib/mysql
映射到宿主机的/data/mariadb
目录中PS: 后面笔者会将全部容器依赖的一些数据都放在/data
目录下,包括数据库、网站源码、nginx的conf等,目的是为了之后迁移方便,直接将/data
拷贝到新服务器就能够。
mkdir -p /data/nginx/conf.d docker run -p 80:80 -p 443:443 --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d --mount type=bind,source=/data/solution,target=/data/solution --restart=always -d --name nginx nginx
说明:sql
--mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d
是为了将nginx的配置目录映射到宿主机的目录中,这样当nginx容器被销毁时,依然能保留配置。/data/solution
用于存放网站项目,也是为了数据与容器分离。能够在php的官方镜像源找到最新版本的php,在实际使用中,咱们可能还须要装一些php的扩展,而官方源中支持已经帮咱们安装了一些扩展的php镜像,如:php:<version>-fpm
,其中的<version>
指的是php版本,具体能够从官方镜像源找到,当前最高版本是7.4。docker
docker run --name php-fpm -p 9000:9000 --mount type=bind,source=/data/solution,target=/data/solution --restart=always -d php:7.4-fpm
这里也将网站根目录/data/solution
映射到php容器中,为了php能正确读取nginx中的root配置项。数据库
因为typecho须要用到pdo_mysql
扩展,所以要在php-fpm
上安装这个扩展。json
# 进入到`php-fpm`容器内部 docker exec -it php-fpm bash # 安装扩展 docker-php-ext-install pdo_mysql # 查看是否已经成功安装 php -m # 退出容器 exit
如今机器上已经运行着nginx
、PHP
、mariadb
三个服务了,他们分别跑在宿主机的80(443)
、9000
、3306
端口上。咱们如今须要作到的是让nginx可以使用php的服务,php可以调用mariadb的服务,但容器间默认是互相隔离的,无法直接通讯,所以须要想办法让他们可以互相通讯。容器间的通讯初次接触会有点复杂,因此在这里先和你们分享下一些要点。
经过了解,容器间通讯主要会有如下几种方法:
bridge
网络,用网桥给容器分配的ip进行通讯,官方不推荐用于生产环境。bridge
网络,能够经过容器名链接,官方推荐。host
网络共用宿主机的网络。
不少早期的文章分享都会使用
--link
参数来指定容器通讯,但
这种方法已是过期的了,官方再也不推荐使用,因此我们这里也就再也不用了,用官方推荐的方法更好。
启动容器时,docker默认会将自动将容器绑定到默认的bridge
网络中。打印一下默认的网络:
$ docker network ls NETWORK ID NAME DRIVER SCOPE 17e324f45964 bridge bridge local 6ed54d316334 host host local 7092879f2cc8 none null local
而后再看一下都有哪些容器链接到了bridge
网络:
docker network inspect bridge
能够看到mariadb,nginx,php-fpm的在bridge中的ip分别是172.17.0.4
,172.17.0.2
,172.17.0.3
,宿主机的ip是172.17.0.1
。
咱们能够经过在容器中经过宿主机的ip来访问对应的服务,即php-fpm想要访问mariadb,能够在php-fpm容器中经过172.17.0.1:3306
来访问。
这种方式只能使用ip来访问对应的容器的服务,而ip可能会变化的,所以是不推荐使用在生产环境的,因此咱们不会使用这种方式。
除了默认的bridge
网络,官方推荐用户自定义一个bridge
网络用做生产环境,用户自定义的bridge网络不只支持ip访问,还支持直接使用容器名称进行访问,官方推荐使用在生产环境,所以咱们会使用这种方式进行容器间的通讯。
typecho
。docker network create typecho
打印一下当前的network,能够看到typecho
已经存在了。
$ docker network ls NETWORK ID NAME DRIVER SCOPE 429eabf557a3 bridge bridge local 3f47e77c0ded host host local 3784484fb92e typecho bridge local 7ff63bc6d9bd none null local
若是容器还没有建立,能够在docker run
命令时经过--network
参数来指定网络,如
docker run -d --name mynginx --network typecho nginx
若是容器已经在运行了,咱们也能够经过docker network connect ${网络名} ${容器名}
来指定,在上面咱们已经运行了mariadb
,php-fpm
,nginx
,因此如今依次为他们都绑定到typecho
网络中。
docker network connect typecho mariadb docker network connect typecho php-fpm docker network connect typecho nginx
检查一下绑定到typecho
网络的容器
$ docker network inspect typecho [ { "Name": "typecho", "Id": "3784484fb92e36c1448d2303af1b8bdce680e2cba0452fca354cefb6cb81bb54", "Created": "2019-12-08T08:32:57.299750734-05:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "6c644a890f3d1e7cc9e846236b6467ac31084470289fba5f6af1c2c1a0171e8e": { "Name": "mariadb", "EndpointID": "881c4f00a8d15f4e941d50faf53846a3ab8f15772fccc5e8c568e8d97b346b3b", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }, "f98355c7b220c0ab2897aa2478037e3322d78ccd81518af7a4756b07e1e26719": { "Name": "nginx", "EndpointID": "f14e5c36fcfe7ac5f26b8495335366957b6d7ab6d59c13e55cae2f1dc7751929", "MacAddress": "02:42:ac:12:00:04", "IPv4Address": "172.18.0.4/16", "IPv6Address": "" }, "f9cb6cfcebf6f82beca76d3061765c1deb482a9c3c30d0c6d3644fe10ae40e3e": { "Name": "php-fpm", "EndpointID": "c4a2e26fe887e04f01a36eea9771eb2e817ef29d1bd7c435b380a7ca18485e64", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
能够看到mariadb
,php-fpm
,nginx
都已经链接到typecho
网络了。这样,咱们在nginx
容器,就能够直接经过php-fpm
的名字来调用php的服务了。
若是容器使用了host
网络,即docker运行时经过--network host
来指定容器的网络,会使得容器共享宿主机的网络配置,即容器的localhost就是宿主机的localhost。
直接使用Docker host网络最大的好处就是性能更好,若是容器对网络传输效率有较高要求,则能够选择host网络。固然不便之处就是牺牲一些灵活性,好比要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。
咱们这里暂时不使用这种方式。
因为是第一次迁移,新旧两个数据库的配置可能会有些不同,因此为了避免改变新服务器的一些配置,咱们只迁移mariadb中涉及到数据的部分。
具体操做就是: 将原服务器/var/lib/mysql
中数据库相关的文件夹提取出来,如旧服务器有两个名为typecho
和test
的数据库,就只将这两个文件夹复制到新服务器的/data/mariadb
中,而后重启一下mariadb便可:docker restart mariadb
。
PS: 还有一种迁移办法是能够选择将旧服务器的数据库备份成sql文件,而后在新服务器作还原哦。
笔者这里将typecho的源代码放到/data/solution/typecho
文件夹中。
vi /data/nginx/conf.d/typecho.conf
server { listen 80; server_name localhost; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { root /data/solution/typecho; fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
server_name我这里写了localhost,暂时算是本地测试一下,实际使用时会改为域名。
修改nginxi配置后须要重启一下nginx的镜像才能生效:docker restart nginx
。
config.inc.php
注意数据库链接的配置,数据库的host能够直接使用mariadb
,由于前面将两个容器绑在了同一个网络,php能正常解析到。
/** .... */ /** 定义数据库参数 */ $db = new Typecho_Db('Pdo_Mysql', 't_'); $db->addServer(array ( 'host' => 'mariadb', 'user' => 'root', 'password' => 'YOUR_PASSWORD', 'charset' => 'utf8', 'port' => '3306', 'database' => 'typecho', ), Typecho_Db::READ | Typecho_Db::WRITE); Typecho_Db::set($db);
至此,整个迁移过程就完成了,能够用curl localhost
测试一下或在浏览器中直接使用服务器的ip来访问页面啦。
PS: 记得不要忘了要打开服务器的80端口防火墙哦~~Tips: 若是无法正常启动typecho,多是某一步配置的不对,能够经过
docker logs <container_name>
命令查看对应容器的日志,而后查找相关的解决办法哦。附上两篇typecho解决错误的文章:Typecho 部署踩坑, 安装Typecho卡在“确认您的配置,数据库配置”问题的终极解决方法
用上docker最爽的一点就是不用再关心怎么安装软件的过程了,整个过程十分清爽。在整个过程当中有几点能够留意一下:
/data
目录中,是为了方便管理和之后迁移;/data/nginx/conf.d
增长一个配置。因为是第一次用上docker迁移,第一次会有点折腾,但之后再迁移就会方便多了。整个流程大概会是这样子:
# 在新服务器拉取旧服务器的数据 scp -r root@<old_server_ip>:/data /data/ # 安装docker-ce # 新建一个网络 docker network create typecho # 分别启动mariadb,php-fpm,nginx三个容器,并绑定typecho网络 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test --mount type=bind,source=/data/mariadb,target=/var/lib/mysql --restart=always --network typecho --name mariadb mariadb docker run --name php-fpm -p 9000:9000 --mount type=bind,source=/data/solution,target=/data/solution --restart=always --network typecho -d php:7.4-fpm docker run -p 80:80 -p 443:443 --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d --mount type=bind,source=/data/solution,target=/data/solution --restart=always --network typecho -d --name nginx nginx # 安装php扩展 docker exec -i php-fpm docker-php-ext-install pdo_mysql # 测试走起 curl localhost