docker学习

自有服务器配置

系统环境

阿里云Ubuntu18.04

软件部署

tomcat使用docker部署
apache使用docker部署
nginx使用docker部署
php使用docker部署
Mysql部署在本地
应用程序部署在本地

路径规划

web根路径:/var/www/html/
nginx配置文件路径:/etc/nginx/;/usr/lib/nginx/modules/
nginx log路径:/var/log/nginx/
apache配置文件路径:/etc/apache/
apache log路径:/var/log/apache/
tomcat的配置文件路径:/usr/local/tomcat/
tomcat log路径:/var/log/tomcat/
phpmyadmin绝对路径:/usr/share/phpmyadmin/

部署过程

本地程序部署(Mysql,phpmyadmin)

# 安装mysql
$ sudo apt-get install mysql-server mysql-client
# 安装phpmyadmin,两种方式
$ git clone https://github.com/phpmyadmin/phpmyadmin.git /usr/share/phpmyadmin # 需要php7.1以上版本
$ wget -c https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip # 适用php5.6~7.2版本
# 解压
$ unzip phpMyAdmin-4.8.4-all-languages.zip
$ sudo mv phpMyAdmin-4.8.4-all-languages /var/www/html/phpMyAdmin

安装docker

# 删除可能存在的docker程序
$ sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新源
$ sudo apt-get update

# 安装必要程序,使得apt可以支持https
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

# 添加docker官方的 GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 检查apt-key是否正确
$ sudo apt-key fingerprint 0EBFCD88
# 输出:
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

# 添加docker的stable库到源中
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 升级源索引
$ sudo apt-get update

# 安装docker
$ sudo apt-get install docker-ce

# 配置加速器
$ vi /etc/docker/daemon.json
# 添加官方镜像
{
          "registry-mirrors": ["https://registry.docker-cn.com"]
}
# 重启docker引擎,测试
$ sudo docker container run hello-world

docker部署完毕

pull镜像

搜索镜像/下载镜像
# NGINX
$ sudo docker search nginx
$ sudo docker pull nginx
# APACHE
$ sudo docker search httpd
$ sudo docker pull httpd
# TOMCAT
$ sudo docker search tomcat
$ sudo docker pull tomcat
# PHP
$ sudo docker search php
$ sudo docker pull php:7.0-fpm
# 如需别的版本,可以把7.0-fpm修改为5.6-fpm或者7.2-fpm

容器管理

配置nginx容器

# 运行一个容器,名字叫testweb,使用nginx:latest镜像
$ sudo docker run --name testweb -d nginx:latest

# 查看
$ sudo docker ps -a
2e62644b6ef1        nginx:latest        "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes                80/tcp              testweb
# 其中:2e62644...为镜像的hash序号
# 进入运行的容器内部(退出命令为ctrl+p+q)

$ sudo docker exec -it 2e62644 /bin/bash
# 查看nginx配置文件所在目录

# ls -al /etc/nginx/
# 重新开启一个服务器tty,对照刚才查看的容器内nginx配置文件,把他们拷贝到宿主机,目录在文章头部已经约定
$ sudo docker cp 2e6:/etc/nginx /etc/
$ sudo docker cp 2e6:/usr/lib/nginx/modules /usr/lib/nginx/

# 停止刚才临时启动的testweb容器,并删除他
$ sudo docker container stop testweb
$ sudo docker container rm testweb
# 还可以
$ sudo docker system prune
# 注意:此命令会删除所有不在运行状态的容器,慎用,尽量使用删除指定容器的命令

# 编辑nginx在宿主机的配置文件,修改需要的配置参数,例如处理器数量等
$ sudo vi /etc/nginx/nginx.conf
# 按照需要配置,server_name修改为域名
$ sudo vi /etc/nginx/conf.d/default.conf

# 启动容器,测试配置文件是否正常,使用-v参数,将宿主机目录挂载进容器,这样做的目的是可以方便的修改各种配置文件,而不用登陆容器
-v/-p 的使用方法 宿主机:容器
$ sudo docker run -d --name web -p 10080:80 -v /etc/nginx:/etc/nginx -v /var/lib/nginx/modules:/var/lib/nginx/modules -v /var/www/html:/usr/share/nginx/html -v /var/log/nginx:/var/log/nginx nginx:latest
# 访问http://主机:10080,出现nginx欢迎页面
# 停止并删除该容器
$ sudo docker container stop web&& sudo docker container rm web

配置php容器,安装php扩展

# 运行一个容器,名字叫做testphp,使用phpdockerio/php7-fpm:latest镜像
$ sudo docker run -d --name testphp phpdockerio/php7-fpm:latest

# 进入容器
$ sudo docker exec -it testphp /bin/bash

# 安装php扩展,在容器内
$ sudo docker-php-source extract
$ sudo docker-php-ext-install 扩展名
# 例如
$ sudo  docekr-php-ext-install mysqli
# 如需安装必须的依赖包,则
$ sudo  apt-get update
$ sudo apt-get install -y 依赖包名
# 例如:安装mcrypt和gd要安装如下依赖
$sudo apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev

# 最后,删除开始解压的source
$ sudo docker-php-source delete
# 其他扩展安装方式以后补充

# 另开一个终端
$ sudo mkdir /etc/php
$ sudo docker cp ae23f3:/usr/local/etc /etc/php/7.0
$ sudo cp /etc/php/7.0/php/php.ini-production php.ini

# 生成一个新的镜像
$ sudo docker commit ae23f3 php7.0-fpm-ext:1.0

连接NGINX和PHP容器,建立PHP开发环境

# 修改nginx配置文件
$ sudo vi /etc/nginx/conf.d/default.conf
# 修改如下部分(尤其注意两个/var/www/html,和php:9000)
location ~ \.php$ {
        root           /var/www/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        include        fastcgi_params;
    }

# 使用新镜像运行一个php容器
$ sudo docker run -d --name php -v /etc/php/7.0:/usr/local/etc -v /var/www/html:/var/www/html -p 9000:9000 php7.0-fpm-ext:1.0
# 关于映射端口的思考,如果在同一台宿主机上运行单个php容器,则无需映射端口,tomcat也是同理,原则就是:按需映射端口,尽可能不要让端口暴露在公网。
$sudo docker run -d --name nginx -p 10080:80 -v /etc/nginx:/etc/nginx -v /var/log/nginx:/var/log/nginx -v /var/www/html:/usr/share/nginx/html --link php:php nginx:latest 

# 测试
# 在宿主机/var/www/html/下建立phpinfo.php,内容如下

<?php
phpinfo();
?>

# 访问http://服务器地址:10080/phpinfo.php

设置MYSQL,设置phpmyadmin

1.设置mysql

$ sudo vi /etc/mysql/mysql.conf.d/mysql.cnf
# 修改如下内容
bind-address            = 172.17.0.1 #该ip地址是docker宿主机的默认ip
# 增加如下内容
query_cache_type        = 1
$ mysql -uroot
mysql> use mysql;
# 修改连接密码,此处只适用于mysql5.7及以下版本
mysql> set password for root@localhost = password('123456'); 
# 设置外部网络访问权限
mysql> update user set host='%' where user = 'root';
# 注意:生产环境配置完后,只开放指定数据库用户的远程访问,将root设定为只能从localhost访问

2.设置phpmyadmin

$ cd /var/www/html/phpMyAdmin
$ sudo mkdir tmp && sudo chown www-data.www-data -R ./tmp
$ sudo cp config.sample.inc.php config.inc.php
$ sudo vi config.inc.php
# 修改17行
$cfg['blowfish_secret'] = 'ff18d1baa624d81dfb28757fa80ad5dad50f87c693db8a1c6e84e1e118f919d9'
# 修改31行
$cfg['Servers'][$i]['host'] = '172.17.0.1';

3.测试
访问http://主机:10080/phpMyAdmin

配置tomcat容器(以下配置属于测试,还不完善)

# 启动一个tomcat容器
$ sudo docker run -d --name testjava -p 8080:8080 tomcat:latest
进入testjava容器
$ sudo docker exec -it testjava /bin/bash

# 将相关目录复制到宿主机
# 开启另一个终端
$ sudo docker cp testjava:/usr/local/tomcat/conf /usr/local/tomcat/
$ sudo docker cp testjava:/usr/local/tomcat/temp /usr/local/tomcat/ #tomcat运行的临时文件
$ sudo docker cp testjava:/usr/local/tomcat/work /usr/local/tomcat/ #tomcat运行的临时文件
$ sudo docker cp testjava:/usr/local/tomcat/logs /var/log/tomcat
$ sudo docker cp testjava:/usr/local/tomcat/webapps /var/www/html/

# 修改配置文件
$ sudo vi /usr/lcoal/tomcat/server.xml
找到如下行,增加address一句,此处按需修改,在同一宿主机上配置时,可以不做# 修改
<Connector port="8080" address="容器ip" protocol="HTTP/1.1"

# 停止并删除此容器
$ sudo docker container stop testjava && sudo docker container rm testjava

# 重新启动一个tomcat容器
$ sudo docker run -d --name tomcat -v /usr/local/tomcat/conf:/usr/local/tomcat/conf -v /var/log/tomcat:/usr/local/tomcat/logs -v /usr/local/tomcat/work:/usr/local/tomcat/work -v /usr/local/tomcat/temp:/usr/local/tomcat/temp -v /var/www/html/webapps:/usr/local/tomcat/webapps tomcat:latest

连接NGINX和tomcat容器,建立tomcat开发环境

# 查看已经运行的tomcat容器ip地址:
$ sudo docker inspect tomcat| grep IPAddress

编辑nginx配置文件
$ sudo vi /etc/nginx/conf.d/defautl.conf
# 最基本的配置就是把所有的请求都转发给tomcat
在12行左右,第一个location /{}中,增加如下内容:
index index.jsp index.php index.html index.htm;
proxy_pass http://172.17.0.4:8080; # 172.17.0.4就是tomcat容器的ip
# 因为我们的nginx对外的端口是10080,所以,还需要增加如下
proxy_set_header  Host $host:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http://$host http://$host:$server_port;
# 如需实现jsp|jsps|do文件交给tomcat,其他文件交给nginx,还需要定义location进行配置
# 将静态文件指定在特定location即可

# 重启tomcat容器,重启nginx容器
$ sudo docker container restart tomcat && sudo docker container restart nginx
# 测试
http://主机地址:10080/index.jsp

# 还有就是只把java请求转发给tomcat,增加如下location,不再使用全局的proxy_pass
location ~ \.(jsp|jspx|do)?$ {
        proxy_pass http://172.17.0.4:8080;
    }

补充,使用docker部署wordpress

建议使用本地mysql,参照上文安装并配置好mysql
建立wordpress用户/密码,并生成wordpress数据库

$ sudo docker pull wordpress
$ sudo docker run -d --name wordpress -p 10080:80 -e WORDPRESS_DB_HOST=172.17.0.1:3306 -e WORDPRESS_DB_USER=用户名 -e WORDPRESS_DB_PASSWORD=密码 -e WORDPRESS_DB_NAME=数据库名称 wordpress:latest
访问http://主机:10080,完成wordpress的安装,简单的一批啊。。。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注