docker部署实战(docker安装,镜像构建,容器通信 等等)
一 docker整体部署架构
本项目建议部署架构:
1 本地安装mysql保证数据的保存
2 其他构建一个镜像,打包
二 部署docker
1 部署前期准备(适用于Ubuntu)
1 安装docker
1.1 卸载旧版本
$ sudo apt-get remove docker docker-engine docker.io containerd runc
1.2 一键安装docker
1 使用官方安装脚本进行自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2 使用国内daocloud一键进行安装
curl -sSL https://get.daocloud.io/docker | sh
1.3 测试安装是否成功
docker --version
示例如下:
1.4 Docker镜像加速
建议配置自已阿里云专有镜像(需要注册账号):https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
按上述在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
vim /etc/docker/daemon.json
写入内容如下:
{"registry-mirrors": ["https://4oepeg1n.mirror.aliyuncs.com"]}
重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
1.5 测试:运行hello-world镜像
docker pull hello-world (拉取镜像)
docker run hello-world (运行容器)
成功如下:
2 部署后端基础镜像 (可跳转到最后。直接使用我写好的shell脚本)
Ubuntu 16.04.6 LTS
Python 3.5.2
Nginx 1.12.2
2.1 开始构建后端镜像(可跳到第2.3点-直接拉起)
docker pull ubuntu
2.2 开启一个容器,开始构建(python3.5.2)镜像
1 安装python 3.5.2
$ wget -c https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
$ tar -xzvf Python-2.7.9.tgz
$ cd Python-2.7.9/
$ LDFLAGS="-L/usr/lib/x86_64-linux-gnu" ./configure
$ make
$ make install
输入python 3 ,安装成功
由此,所需要的python版本安装成功
2 开始安装项目所需要的python包
docker cp /meanning ea81a6eb523b:/meanning # 复制文件到容器内
pip install -r requirements.txt # 安装项目所依赖的包
遇到pip升级的问题,解决:
sudo apt-get --purge remove python3-pip
curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py
python3.5 get-pip.py
2.3 基础镜像构建完成
后面遇到了的坑比较多,直接省略:
可直接拉取我已经构建好的ubuntu+python+pip+所需要的安装包
docker pull huawang400/m-python3.5-packages:latest
docker run it --name xxx img_id(镜像id) # 交互式运行容器
exit # 退出容器
docker exec -it 8d7e bash # 进入正在运行的容器
docker inspect m12-mysql # 查看容器的ip或挂载
在此镜像基础上 安装redis
# 安装redis
apt install redis-server
# 查找redis安装目录(/etc/redis)
whereis redis
# 启动redis
redis-server /etc/redis/redis.conf
# 查看
ps -aux
安装mongodb
1 安装mongodb数据库
安装方式参考我的博客:https://www.cnblogs.com/huahuawang/p/14814176.html
2 安装mongodb database tools(用于备份,导入,恢复存储数据)
https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu1804-x86_64-100.5.0.deb
tar -zxvf mongodb-database-tools-ubuntu1604-x86_64-100.5.0.tgz #解压
3 启动mongod
mongod --config /etc/mongodb.conf
导入数据
数据文件夹 :meanning-mongo-init
1 创建数据库meanning12
执行如下命令:
mongo
use meanning12
2 退出后使用 mongorestore恢复数据
mongorestore -d meanning12 /root/meanning-mongo-init
意外情况:shelll脚本启动数据库redis,mongo
/root/start_dbs.sh
安装supervisor进程管理工具
1 安装
sudo apt-get install supervisor
2 生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
mkdir -p /etc/supervisor.d // supervisord 支持include 的方式将多个配置放置不同文件中, 需要配置文件中指定
3 启动supervisor
supervisord -c /etc/supervisord.conf # 主配置文件
配置说明:
/etc/supervisord.conf (主配置文件)
/etc/supervisor.d/ (默认子进程配置文件,也就是需要我们根据程序配置的地方)
安装示例:
1拷贝 宿主机 etc/supervisor.d 和 etc/supervisord.conf到容器内
docker cp supervisor.d 0c648948cb64:/etc/supervisor.d
docker cp supervisord.conf 0c648948cb64:/etc/supervisord.conf
2 页面访问:
port=0.0.0.0:9876 ; ip_address:port specifier, *:port for all iface
username=admin ; default is no username (open server)
password=meanning0
安装nginx高性能服务器
1 安装
apt install nginx
2 查看配置文件目录
whereis nginx
3 修改配置文件
默认配置文件 etc/nginx
4 添加nginx到PATH中,开机就去读
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:ngix执行路径
source /etc/profile # 使其立即生效
5 nginx常用命令
nginx # 首次输入直接启动,不得再次输入
nginx -s reload # 平滑重启,重新读取nginx的配置文件,而不重启进程
nginx -s stop #停止nginx进程
nginx -t #检测nginx.conf语法是否正确
6 访问nginx首页站点
http://192.168.178.140:80/index.html
由此项目环境镜像基本成型
ubuntu+python3.5(包含相关的包)+uwsgi+redis+mongodb(包含数据)+pip(包含相关的包)+nginx(相关配置)
待处理:项目代码的cp,端口映射,nginx启动
生成镜像huawang400/meanning-base1 (没有代码数据,需要调整后使用)
拉取镜像:docker pull huawang400/meanning-base1
生成镜像huawang400/meanning-base2 (包括代码,supervisor配置等)
docker load < /root/docker.gz/meanning-base2.tar.gz # 加载已经构建好的mysql
docker run --name m12-mysql -e MYSQL_ROOT_PASSWORD=root123456 -d -p 8001:3306 my-mysql-data # 启动mysql服务器
2.4 构建mysql镜像(建议安装到本地服务器上)
方案一:注意修改代码中关于mysql配置代码中的ip:port
# 安装到本地服务器上
sudo apt-get install mysql-server //服务端
sudo apt-get install mysql-client //客户端
sudo apt-get install libmysqlclient-dev //程序编译时链接的库
#安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功:
#详情查看链接:
https://www.cnblogs.com/hellocxz/p/13426625.html
方案二:
# 拉取我已经构建好的基础mysql(不含数据)
docker pull huawang400/mysql
# 启动一个mysql服务器
docker run --name m12-mysql -e MYSQL_ROOT_PASSWORD=root123456 -d -p 8001:3306 mysql # 启动mysql服务器
## 解释
-e MYSQL_ROOT_PASSWORD=root123456为mysql的服务器密码
-d 后台运行
-p 端口映射 服务器8001-->docker3306
# 连接后导入数据
创建数据库:meanning12
导入sql语句 ok!!
方案三:
使用压缩包加载
执行我已经写好的sh脚本(作用:1导入镜像。2启动一个容器)
bash /root/docker.gz/my-mysql.sh
docker load < /root/docker.gz/my-mysql.tar.gz # 加载已经构建好的mysql
docker run --name m12-mysql -e MYSQL_ROOT_PASSWORD=root123456 -d -p 8001:3306 my-mysql-data # 启动mysql服务器
3 解决容器内网络互通的问题
3.1 容器创建的时候使用自定义网络
docker network create --help
# 自定义创建网络默认default "bridge"
# 自定义创建一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
##bridge -网络模式桥连接 subnet - 子网络网段 gateway - 路由 mynet- 网络名
docker network inspect mynet # 查看网络信息
##自定义网络修复了docker0的容器之间无法用容器名相互ping通的问题,只能使用ip才能ping通,但是我们自定义的网络是可以用ip或者容器名相互ping通的
3.2 使用自己的mynet ,开启2个容器
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat
3.3 查看自定义网络信息
docker network inspect mynet
3.4 相互使用容器名ping测试
docker exec -it tomcat01 ping tomcat02
docker exec -it tomcat02 ping tomcat01
# 相互可以ping通(测试成功)
注意 如果创建的容器不在该网段如何能和该网段内容器进行ping呢?
我们如果在创建一个容器不在该网段内如何能和该网段内的容器进行ping呢?
docker -d -P --name tomcat03 tomcat(没有加-net默认是走docker0的网段)
docker -d -P --name tomcat04 tomcat(没有加-net默认是走docker0的网段)
网络链接:(容器和网络链接,不是docker0和网络链接)
docker network connect mynet tomcat03
链接完成之后再去ping
docker exec -it tomcat02 ping tomcat03
# 可以ping通了(一个容器两个ip)docker inspect d1c4c32c1d6c(tomcat03的id)
参考链接:https://www.cnblogs.com/aaawei/p/13402289.html
三 开始在构建好的镜像部署项目
以下是基于mysql建立在本地的基础上构建的
3.1 准备项目与文件(宿主机上与docker内一样位置)
打包好的项目文件--> meannning12.zip
解压后安装到 /meanning/Project/meanning12
打包好文件 --> /root/Meanning/OpenSource
supervisor 相关主要配置:
web访问端口 9876
usename=admin
password=meanning0
sh脚本:
# 启动一个容器(基于huawang400/meanning-base1)
docker run -it --name meanning12-test1 huawang400/meanning-base1
# 在容器内创建需要的文件夹 (后期可使用挂载解决)
mkdir /meanning
mkdir /meanning/Project
mkdir /root/Meanning
# 复制宿主机内指定文件到容器指定目录 (后期可使用挂载解决)
docker cp /meanning/Project/meanning12 f8ae3ae2e8a3:/meanning/Project/meanning12
docker cp /root/Meanning/OpenSource f8ae3ae2e8a3:/root/Meanning/OpenSource
# 启动redis和mongodb (后期可将mongodb分离出来,修改代码配置文件即可)
在容器内执行:
bash /root/start_dbs.sh
# 代码中修改mysql链接的配置,数据库链接的ip和密码
/meanning/Project/meanning12/meanning_server/configs/storage_congig.py
最终使用:
1 导入镜像
直接执行:/root/docker.gz/menning-base2.sh
# docker load < /root/docker.gz/meanning-base2.tar.gz # 加载已经构建好的镜像
# docker run --name m12-base -it -p 8002:8082 8083:9876 meanning-base2 # 启动进入一个容器
# 8082为前端接口 8083为supervisor页面端口
2 在容器中执行命令:# 启动redis,mongodb,nginx,supervisor
bash /root/start_dbs_nginx_supversor.sh
ok!!
其他:
uwsgi.ini 服务器启动在 8099端口
nginx监听在8082端口,负载均衡在8099端口
注意在启动容器的时候
查看端口占用情况
#例如验证服务器80端口是否存在
netstat -tunlp | grep 80
需要在开启容器的时候与宿主进行一个映射(宿主机:容器端口)
8082 : 8082 # nginx监听端口
8083 : 9876 # supervisor web页面
8084 :27017 # mongodb-27017端口