跳至主要內容

docker笔记

Moments大约 16 分钟

docker笔记


docker镜像加速

阿里云容器服务

阿里云容器镜像服务open in new window

针对安装Docker for Mac的用户,您可以参考以下配置步骤:

在任务栏点击 Docker Desktop 应用图标,
Perferences,
在左侧导航菜单选择 Docker Engine,
在右侧输入栏编辑 json 文件。
将https://{签名}.mirror.aliyuncs.com加到"registry-mirrors"的数组里,
点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。

查看配置是否成功

// Registry Mirrors:
docker info

其他镜像加速点

// Docker中国区官方镜像
https://registry.docker-cn.com
// 网易
http://hub-mirror.c.163.com
// ustc 
https://docker.mirrors.ustc.edu.cn
// 中国科技大学
https://docker.mirrors.ustc.edu.cn

centos8环境配置

拉取centos8

// 拉取centos8镜像
docker pull centos:centos8
// 查看本地镜像
docker images | grep centos8

启动centos8

// 查看所有容器
docker ps -a 
// 启动容器
docker start c1d29cf89bf4(容器id)
// 关闭容器
docker stop c1d29cf89bf4(容器id)
// 删除容器
docker rm c1d29cf89bf4(容器id)
// 查看镜像
docker images
// 倒序启动所有的容器命令,就不用特殊处理ip了
docker start $(docker ps -a | tail -n +2 | awk '{line[NR]=$1} END {i=NR; while(i>0) {print line[i]; i=i-1}}')
// 关闭所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
// 删除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
// 删除所有的镜像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
参数说明
-d后台运行
-i交互模式
-t为容器重新分配一个伪输入终端
--privileged权限设置(access to all devices)
--name容器别名
-p端口映射 宿主端口:容器端口
// 创建容器
docker run -dit -p 800:80 -p 1022:22 --privileged=true --name=centos8 centos:centos8 /usr/sbin/init
docker exec -it centos8 /bin/bash

查看容器id地址

// 查看容器IP地址,172.17.0.2
docker inspect centos8|grep "IPAddress"

容器生成镜像

// 停止容器
docker stop centos8
// 提交容器生成镜像
docker commit -m="添加php73" -a="Moments" centos8 centos8:php73
// 创建容器
docker run -dit -p 800:80 -p 1022:22 --privileged=true --name=centos8 centos8:php73 /usr/sbin/init
docker exec -it centos8 /bin/bash
// 停止容器
docker stop centos8
// 提交容器生成镜像
docker commit -m="添加nginx" -a="Moments" centos8 centos8:nginx
// 创建容器
docker run -dit -p 800:80 -p 1022:22 -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 --privileged=true --name=centos8 centos8:nginx /usr/sbin/init
docker exec -it centos8 /bin/bash
// 停止容器
docker stop centos8
// 提交容器生成镜像
docker commit -m="添加mysql8" -a="Moments" centos8 centos8:mysql8
docker tag [镜像id] registry.cn-shenzhen.aliyuncs.com/[空间]/[镜像名]:[标签]
docker push registry.cn-shenzhen.aliyuncs.com/[空间]/[镜像名]:[标签]

windows安装

// 
Docker Desktop Installer.exe
// 如果报错的话,更新ws可
wsl_update_x64.msi

centos安装

// 设置仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// 安装docker
yum install docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl status docker
systemctl start docker
// 拉取镜像包
docker pull centos:8.3.2011
// 生成实例
docker run -dit -p 800:80 -p 8443:443 -p 1022:22 -p 3316:3306 -e MYSQL\_ROOT\_PASSWORD=123456 --privileged=true --name=centos8 centos:8.3.2011 /usr/sbin/init
docker run -dit -p 800:80 -p 8443:443 -p 1022:22 -p 3316:3306 -e MYSQL\_ROOT\_PASSWORD=123456 --privileged=true --name=centos8 centos8:docker /usr/sbin/init
// 进入实例
docker exec -it centos8 /bin/bash

删除docker

systemctl stop docker
yum list installed | grep docker
yum remove docker-ce docker-ce-cli containerd.io -y
rm -rf /var/lib/docker

动态添加docker端口映射

systemctl stop docker
cd /var/lib/docker/containers/{实例id}
// 设置实例开放的端口,config.v2.json
// 设置实例的端口映射关系,hostconfig.json
systemctl start docker
"Config": {
    "ExposedPorts": {
        "80/tcp": {},
        "9501/tcp": {}
    }
}
"PortBindings": {
    "9501/tcp": [
        {
            "HostIp": "",
            "HostPort": "9501"
        }
    ]
}

docker 入门


Docker基本应用

注册docker帐号

>>>https://cloud.docker.com/ #注册地址

创建一个仓库repository

拉取一个公开镜像到本地

>>>sudo docker pull ubuntu #将镜像拉取到本地
>>>sudo docker images #查看本地镜像
>>>$ docker tag local-image:tagname reponame:tagname
>>>sudo docker tag ubuntu pythonschool/ubuntu #创建一个与服务器上相同名的镜像
>>>$ docker push reponame:tagname
>>>sudo docker push pythonschool/ubuntu #将镜像上传到仓库
#denied: requested access to the resource is denied
#如果报错就需要切换到root用户下进行操作
>>>sudo su - #切换到root用户
>>>docker push pythonschool/ubuntu #再次进行上传操作

启动docker 后台服务

>>>sudo service docker start 

拉取

>>>sudo docker pull ubuntu:16.04

在容器里运行应用程序

>>>sudo docker run ubuntu:16.04 /bin/echo "Hello World!"
#run:与前面的 docker 组合来运行一个容器。
#/bin/echo "Hello world": 在启动的容器里执行的命令

运行交互式的容器

>>>sudo docker run -i -t ubuntu:16.04 /bin/bash
#-t:在新容器内指定一个伪终端或终端
#-i:允许你对容器内的标准输入进行交互

启动容器(后台模式)

>>>sudo docker run -d ubuntu:16.04 /bin/sh -c "while true;echo Hello world; sleep 1; done"

查看容器内的后台输出

>>>sudo docker logs 容器ID

停止容器

>>>sudo docker ps #查看活动的容器
>>>sudo docker stop 容器ID

查看容器的端口映射

>>>sudo docker port 容器ID

删除容器

>>>sudo docker rm 容器ID

列出镜像列表

>>>sudo docker images

拉取镜像

>>>sudo docker pull ubuntu:16.04

查找镜像

>>>sudo docker search ubuntu

创建镜像

#从已经创建的容器中更新镜像,并且提交这个镜像
#使用Dockerfile指令来创建一个新的

提交容器生成一个新镜像

>>>sudo docker commit -m="更新容器" -a="Moments" 容器ID  目标镜像名
#-m:提交的描述信息
#-a:指定镜像作者

使用Dockerfile进行构建

#Dockerfile
FROM ubuntu
>>>sudo docker build -t newimage . #-t:选项指定要创建的目标镜像名,.:指当前目录

Dockerfile结构

#第一行必须指令基于的基础镜像
From ubutu

#维护者信息
MAINTAINER docker_user  docker_user@mail.com

#镜像的操作指令
apt/sourcelist.list

RUN apt-get update && apt-get install -y ngnix 
RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf

#容器启动时执行指令
CMD /usr/sbin/ngnix

docker 查看容器ip

>>>sudo docker inspect 容器id #可以查看到容器的相关信息

各种错误解决方案

解决 Docker pull 出现的net/http: TLS handshake timeout

#不用官方的dockhub,转而使用国内的仓库daocloud
>>>echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
>>>sudo service docker restart
>>>docker push pythonschool/ubuntu

docker容器运行后退出,怎么才能一直运行?

现象
启动docker容器 
docker run –name [CONTAINER_NAME] [CONTAINER_ID] 
查看容器运行状态 
docker ps -a 
发现刚刚启动的mydocker容器已经退出

原因

docker容器的主线程(dockfile中CMD执行的命令)结束,容器会退出

办法

可以使用交互式启动

docker run -dit [CONTAINER_NAME or CONTAINER_ID]

上面的不太友好,建议使用后台模式和tty选项

docker run -dit [CONTAINER_NAME or CONTAINER_ID]

查看容器状态

docker ps -a

docker调出后台容器

docker attach [CONTAINER_NAME or CONTAINER_ID]

TIPs:退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束,可以使用[ctrl + P][ctrl + Q]退出而不终止容器运行

如下命令,会在指定容器中执行指定命令,[ctrl+D]退出后不会终止容器运行

docker exec -it [CONTAINER_NAME or CONTAINER_ID] /bin/bash

镜像保存移动

保存镜像为压缩包

>>>sudo docker save -o ubuntu.tar ubuntu:latest #REPOSITORY:TAG

载入镜像压缩包

#从导出的本地文件中再导入到本地镜像库
>>>sudo docker load --input ubuntu.tar
>>>sudo docker load < ubuntu.tar

删除镜像

>>>sudo docker rmi ubuntu #删除ubuntu这个镜像
>>>sudo docker rmi -f ubuntu #强制删除ubuntu这个镜像
>>>sudo docker rmi -f test:first #要记得带上TAG

拉取国内镜像和pythonschool镜像

#到daocloud.io上去找错像然后下载下来就可以了。
>>>sudo docker pull daocloud.io/library/ubuntu:16.04
#私有仓库需要进行指定 
    >>>echo "{\"insecure-registries\": [\"registry.pythonschoolrc.com\"]}" > /etc/docker/daemon.json
>>>docker login registry.pythonschoolrc.com -u websitedev -p Websitepythonschool
>>>docker pull registry.pythonschoolrc.com/website/phpdev:autobuild
>>>docker run -d -v $1:/www/web -P -p 80:80 --dns=192.168.1.46 --name pythonschool registry.pythonschoolrc.com/website/phpdev:autobuild

容器操作

启动容器

>>>sudo docker run -dit --name myubuntu ubuntu /bin/bash
>>>sudo docker exec -it myubuntu /bin/bash

#因为Docker的窗口实在太轻量级了,很多时候用户都是随时删除和创建容器。所以需要的命令主要为docker run。
#下面这个例子是输出一个'Hello World!',之后就终止了容器。
>>>sudo docker run ubuntu /bin/echo 'Hello World!' #启动并输出
#下面的命令则启动一个bash终端 ,允许用户进行交互。
#选项-t让Docker分配一个伪终端并绑定到容器的标准输入上。
#选项-i则让容器的标准输入保持打开。
>>>sudo docker run -t -i ubuntu /bin/bash

在伪终端中利用ps或top查看进程信息

>>>ps
>>>top

使用守护态运行终端(Daemonized)

>>>sudo docker run -d ubuntu /bin/sh 	

实例

实例一、拉取现有镜像

>>>sudo docker pull daocloud.io/library/ubuntu:16.04 #拉取镜像ubuntu
>>>sudo docker pull daocloud.io/library/nginx #拉取镜像nginx
>>>sudo docker pull daocloud.io/library/php #拉取镜像php
>>>sudo docker tag daocloud.io/library/ubuntu:16.04 ubuntu #改别名
>>>sudo docker tag daocloud.io/library/nginx nginx #改别名
>>>sudo docker tag daocloud.io/library/php php #改别名

实例二、在基础镜像ubuntu上安装nginx+php+redis+mysql

>>>sudo docker run -dit --name myubuntu ubuntu /bin/bash #启用后台进程
>>>sudo docker exec -it myubuntu /bin/bash #进入后台docker
>>>apt-get update #先更新系统源
>>>apt-get install apt-transport-https #出错里添加
>>>gpg --keyserver pgp.mit.edu --recv-keys xxxxxxxxx #出错时才添加
>>>gpg --armor --export xxxxxxxxx | apt-key add -
#使用国内源,直接到ubuntu下复制一份就可以了。
#改完国内源后再apt-get update一下。
#可能会报错,因为没有安装https服务。
#可能还会报错,因为阿里云源不是官方的,所以要加入密钥。
#很可惜国内免费的资源也不好用,还是用ubuntu国内源吧。
>>>apt-get install nginx #安装nginx
#>>>service nginx restart(start) #nginx的重启和运行
#>>>sudo docker inspect myubuntu(容器ID) | grep IPAddress #查看Docker服务器的IP地址
./usr/share/nginx
./usr/share/doc/nginx
./usr/sbin/nginx
./var/log/nginx
./var/lib/nginx
./etc/init.d/nginx
./etc/logrotate.d/nginx
./etc/ufw/applications.d/nginx
./etc/default/nginx
./etc/nginx
#在浏览器里输入Docker的IP地址后可以看到nginx已经成功安装。
>>>tail -f /var/log/nginx/error.log #ubuntu 动态查看日志
>>>apt-get install php7.0-fpm #安装php7.0-fpm(fpm是一个中间件)
#在安装好nginx和php7.0-fpm之后要更改nginx以支持php文件解析
#可以参考以下链接进行配置
#https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04
#/etc/nginx/sites-enabled
>>>nginx -t #查看nginx配置是否正确

>>>nginx -s reload #重新启动nginx
#本来这样就算是配置好了,但不好意思出现了一个BUG,没错就是权限BUG。
>>>sudo docker inspect myubuntu #查出IPAddress的IP
#执行http://172.17.0.2/index.php 好吧,502错误(可能是权限哦)。
>>>tail -f /var/log/nginx/error.log #查看nginx的错误日志

#从日志可以看出来,没有这个文件/run/php/php7.0-fpm.sock
>>>find / -name "*php*.sock" #查找之后发现并没有这个文件
>>>touch /run/php/php7.0-fpm.sock #新建个文件

>>>chmod 777 /run/php/php7.0-fpm.sock #当Permission denied时,添加权限

>>>/usr/sbin/php-fpm7.0 #重新启动php-fpm模块
>>>/etc/init.d/nginx restart #重启nginx
#也可以直接使用service php7.0-fpm restart # service nginx restart # nginx -s reload
#好吧,到目前为止可以正常访问了。
>>>apt-get install redis-server #安装redis
#在Docker里启动redis-server

>>>sudo apt-get install redis-tools #在本机安装redis-tools客户端
>>>sudo redis-cli -h 172.17.0.2 -p 6379 #连接远程服务器 -h 主机 -p 端口 -a 密码 --help 帮助
>>>ping #结果为PONG代码安装成功了。
>>>set user.name Moments #使用redis小试一下
>>>keys * #1)"user.name"
>>>apt-get install mysql-server #安装mysql
#在安装的过程中会要求输入密码,这具密码要记住是用来登录mysql的密码。

#又来这种错误,好吧没有的目录就新建,没有的文件也新建,然后再给权限就可以啦。
>>>touch /var/run/mysqld/mysqld.sock #新建文件
>>>chmod 777 mysqld.sock #给权限
>>>service mysql restart #重启mysql服务
>>>mysql -u root -p 123456 #进入mysql
#好啦,到目前为止已经安装成功了。
>>>apt-get install php7.0-mysql
#这里有一个问题,就是新版的mysql已经不再支持mysql_connect来连接数据库了,需要使用mysqli_connect或者PDO来进行此项操作。

实例三、ubuntu+nginx+php+mysql+redis容器生成新镜像

>>>sudo docker pull daocloud.io/library/ubuntu:latest #拉取ubuntu远程镜像
>>>sudo docker images #查看本地镜像
>>>sudo docker tag daocloud.io/library/ubuntu ubuntu #改名
>>>sudo docker rmi -f daocloud.io/library/ubuntu #删除不需要的镜像
>>>sudo docker run -dit --name ubuntu_new -v /etc/apt:/etc/apt ubuntu /bin/bash #生成一个后台容器 将本地的更新源映射到容器相应的目录(本地目录:容器目录)
>>>sudo docker exec -it ubuntu_new /bin/bash #进入容器
>>>apt-get update
>>>apt-get install apt-transport-https #https链接无法打开时提示安装
>>>apt-get update
>>>apt-get install vim #安装vim编辑器
>>>apt-get install net-tools #ifconfig所在组件
>>>apt-cache search php7.0 | grep "^php7.0" #查看所有php7.0相关组件
>>>apt-get install php7.0-fpm php7.0-cli php7.0-gd php7.0-json php7.0-mysql php7.0-sqlite3 php7.0-bz2 php7.0-mbstring php7.0-zip #安装php相关组件
>>>vim /etc/nginx/sites-enabled/default #设置nginx以支持.php文件

>>>vim /var/www/html/index.php #添加一个php测试文件
>>>service nginx restart #重启nginx
>>>service php7.0-fpm restart #重启php7.0-fpm
>>>apt-get install mysql-server #安装mysql

#中途安装的时候可能需要输入登录密码
>>>service nginx restart #重启nginx
>>>service php7.0-fpm restart #重启php7.0-fpm
>>>service mysql restart #重启数据库
>>>vim /var/www/html/index.php #编辑测试用例

>>>exit #退出容器
>>>sudo docker stop ubuntu_new #停止容器
>>>sudo docker commit -m='nginx+php7.0-fpm+mysql' -a="Moments" ubuntu_new moments_dev  
#提交容器生成镜像
####################################################################
>>>sudo mkdir ~/www/html #新建目录
>>>sudo docker run -p 88:80 --name myubuntu_new -v ~/www/html:/var/www/html -dit moments_dev /bin/bash #创建一个容器,-p为端口映射,-v为目录映射
#使用http://127.0.0.1:88就可以访问目标服务器(172.17.0.6)。
#使用本机的~/www/html就对应了服务器中的/var/www/html在本机修改就等于在服务器里修改。

Docker常见命令

容器相关操作

  • docker create # 创建一个容器但是不启动它
  • docker run # 创建并启动一个容器
  • docker stop # 停止容器运行,发送信号SIGTERM
  • docker start # 启动一个停止状态的容器
  • docker restart # 重启一个容器
  • docker rm # 删除一个容器
  • docker kill # 发送信号给容器,默认SIGKILL
  • docker attach # 连接(进入)到一个正在运行的容器
  • docker wait # 阻塞到一个容器,直到容器停止运行

获取容器相关信息

  • docker ps # 显示状态为运行(Up)的容器
  • docker ps -a # 显示所有容器,包括运行中(Up)的和退出的(Exited)
  • docker inspect # 深入容器内部获取容器所有信息
  • docker logs # 查看容器的日志(stdout/stderr)
  • docker events # 得到docker服务器的实时的事件
  • docker port # 显示容器的端口映射
  • docker top # 显示容器的进程信息
  • docker diff # 显示容器文件系统的前后变化

导出容器

  • docker cp # 从容器里向外拷贝文件或目录
  • docker export # 将容器整个文件系统导出为一个tar包,不带layers、tag等信息

执行

  • docker exec # 在容器里执行一个命令,可以执行bash进入交互式

镜像操作

  • docker images # 显示本地所有的镜像列表
  • docker import # 从一个tar包创建一个镜像,往往和export结合使用
  • docker build # 使用Dockerfile创建镜像(推荐)
  • docker commit # 从容器创建镜像
  • docker rmi # 删除一个镜像
  • docker load # 从一个tar包创建一个镜像,和save配合使用
  • docker save # 将一个镜像保存为一个tar包,带layers和tag信息
  • docker history # 显示生成一个镜像的历史命令
  • docker tag # 为镜像起一个别名

镜像仓库(registry)操作

  • docker login # 登录到一个registry
  • docker search # 从registry仓库搜索镜像
  • docker pull # 从仓库下载镜像到本地
  • docker push # 将一个镜像push到registry仓库中
  • docker inspect id | grep IPAddress | cut -d '"' -f 4 # 获取Container IP地址(Container状态必须是Up)

获取端口映射

docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' id

获取环境变量

docker exec container_id env
杀掉所有正在运行的容器

docker kill $(docker ps -q)
删除老的(一周前创建)容器

docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

删除已经停止的容器

docker rm `docker ps -a -q`
删除所有镜像,小心

docker rmi $(docker images -q)
Dockerfile

Dockerfile是docker构建镜像的基础,也是docker区别于其他容器的重要特征,正是有了Dockerfile,docker的自动化和可移植性才成为可能。

不论是开发还是运维,学会编写Dockerfile几乎是必备的,这有助于你理解整个容器的运行。

FROM , 从一个基础镜像构建新的镜像

FROM ubuntu 
MAINTAINER , 维护者信息

MAINTAINER William <wlj@nicescale.com>
ENV , 设置环境变量

ENV TEST 1
RUN , 非交互式运行shell命令

RUN apt-get -y update 
RUN apt-get -y install nginx
ADD , 将外部文件拷贝到镜像里,src可以为url

ADD http://nicescale.com/  /data/nicescale.tgz
WORKDIR /path/to/workdir, 设置工作目录

WORKDIR /var/www
USER , 设置用户ID

USER nginx
VULUME <#dir>, 设置volume

VOLUME [‘/data’]
EXPOSE , 暴露哪些端口

EXPOSE 80 443 
ENTRYPOINT [‘executable’, ‘param1’,’param2’]执行命令

ENTRYPOINT ["/usr/sbin/nginx"]
CMD [“param1”,”param2”]

CMD ["start"]
docker创建、启动container时执行的命令,如果设置了ENTRYPOINT,则CMD将作为参数

Dockerfile最佳实践

尽量将一些常用不变的指令放到前面
CMD和ENTRYPOINT尽量使用json数组方式
通过Dockerfile构建image

docker build csphere/nginx:1.7 .
镜像仓库Registry

镜像从Dockerfile build生成后,需要将镜像推送(push)到镜像仓库。企业内部都需要构建一个私有docker registry,这个registry可以看作二进制的scm,CI/CD也需要围绕registry进行。

部署registry

mkdir /registry
docker run  -p 80:5000  -e STORAGE_PATH=/registry  -v /registry:/registry  registry:2.0
推送镜像保存到仓库

假设192.168.1.2是registry仓库的地址:

docker tag  csphere/nginx:1.7 192.168.1.2/csphere/nginx:1.7
docker push 192.168.1.2/csphere/nginx:1.7

本机负载均衡跳转到Docker

为了IO性能简单处理

// 在镜像列表中,点击"管理"就可以看到操作指南
https://cr.console.aliyun.com/?spm=5176.8351553.aliyun_topbar.10.173e1991wNC9gO#/dockerImage/cn-shenzhen/moments/ubuntu/detail
// 登录阿里云
docker login --username=pythonschool@qq.com registry.cn-shenzhen.aliyuncs.com
// 下载php7.1
docker pull registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:mac
// 运行一个容器
docker run -itd --name mac_81 -p 81:81 -p 82:82 -p 83:83 -p 84:84 -p 85:85 --net mynetwork --ip 172.18.0.81 -v ~/www/html:/var/www/html -v ~/www/html/nginx/sites-enabled:/etc/nginx/sites-enabled registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:mac sh -c '/usr/sbin/nginx & /usr/sbin/service php7.1-fpm start && /usr/bin/redis-server' 
docker run -itd --name mac_91 -p 91:81 -p 92:82 -p 93:83 -p 94:84 -p 95:85 --net mynetwork --ip 172.18.0.91 -v ~/www/html:/var/www/html -v ~/www/html/nginx/sites-enabled:/etc/nginx/sites-enabled registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:mac sh -c '/usr/sbin/nginx & /usr/sbin/service php7.1-fpm start && /usr/bin/redis-server' 

拉取docker镜像

// 在镜像列表中,点击"管理"就可以看到操作指南
https://cr.console.aliyun.com/?spm=5176.8351553.aliyun_topbar.10.173e1991wNC9gO#/dockerImage/cn-shenzhen/moments/ubuntu/detail
// 登录阿里云
docker login --username=pythonschool@qq.com registry.cn-shenzhen.aliyuncs.com
// 下载php7.1
docker pull registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:php7.1
// 下载nginx
docker pull registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:nginx

创建自定义网络

// 创建
docker network create --subnet=172.18.0.0/16 mynetwork
// 查看
docker network ls

创建多个nginx容器

docker run -itd --name nginx_81 -p 81:80 --net mynetwork --ip 172.18.0.81 -v ~/www/html:/var/www/html -v ~/www/html/nginx/sites-enabled:/etc/nginx/sites-enabled registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:nginx /usr/sbin/nginx
docker run -itd --name nginx_82 -p 82:80 --net mynetwork --ip 172.18.0.82 -v ~/www/html:/var/www/html -v ~/www/html/nginx/sites-enabled:/etc/nginx/sites-enabled registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:nginx /usr/sbin/nginx
docker run -itd --name nginx_83 -p 83:80 --net mynetwork --ip 172.18.0.83 -v ~/www/html:/var/www/html -v ~/www/html/nginx/sites-enabled:/etc/nginx/sites-enabled registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:nginx /usr/sbin/nginx

配置调度服务器(docker inspect nginx_801)

upstream backend {
    server 172.17.0.3;
    server 172.17.0.4;
}
server {
    location / {
        proxy_pass http://backend;
    }
    location /favicon.ico {
        root /var/www/html;
    }
}

创建多个php

docker run -itd --name php7.1_91 -p 91:9000 --net mynetwork --ip 172.18.0.91 -v ~/www/html:/var/www/html -v ~/www/html/nginx/php7.1/91:/etc/php/7.1/fpm/pool.d registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:php7.1
docker run -itd --name php7.1_92 -p 92:9000 --net mynetwork --ip 172.18.0.92 -v ~/www/html:/var/www/html -v ~/www/html/nginx/php7.1/92:/etc/php/7.1/fpm/pool.d registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:php7.1
docker run -itd --name php7.1_93 -p 93:9000 --net mynetwork --ip 172.18.0.93 -v ~/www/html:/var/www/html -v ~/www/html/nginx/php7.1/93:/etc/php/7.1/fpm/pool.d registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:php7.1
docker exec -it php7.1_91 /bin/bash
docker exec -it php7.1_92 /bin/bash
docker exec -it php7.1_93 /bin/bash

vim /etc/php/7.1/fpm/pool.d/www.conf /etc/init.d/php7.1-fpm start /etc/init.d/php7.1-fpm restart

listen = 172.18.0.91:9000
; listen = /run/php/php7.0-fpm.sock
listen = 172.18.0.92:9000
; listen = /run/php/php7.0-fpm.sock
listen = 172.18.0.93:9000
; listen = /run/php/php7.0-fpm.sock

服务器配置,安装redis

docker run -itd --name redis --net mynetwork --ip 172.18.0.100 -p 6379:6379 registry.cn-shenzhen.aliyuncs.com/moments/ubuntu:redis
docker exec -it redis /bin/bash
redis-server &

.env

docker inspect redis
// 设置
REDIS_HOST=172.18.0.100
上次编辑于:
贡献者: Moments