从无到有封装一个Docker镜像
从无到有封装一个Docker镜像
众所周知,一个项目上线需要部署服务器,但是部署多台服务器时又会显得特别麻烦,项目中大量的依赖环境难道每一台都需要安装一遍么?也许你可以说python可以封装成exe可执行文件,但是在windows系统中开发有些插件是不支持的,比如uwsgi… 。所以普遍的windows很多事情是不好做的。都已经2020年了,强大的容器技术已经变得无所不能,所以今天就用docker容器来将项目包括所有的依赖封装成镜像!!!在其他的服务器上只需把镜像导入即可,下面开始。。。
1.下载windows版Docker
#进入官网链接下载 https://docs.docker.com/docker-for-windows/install/ #下载完成之后安装
**启动以后会出现在桌面的右下角区域,鼠标放上去以后显示Docker is running表示启动成功 **
2. 测试Docker,并拉取一个centos镜像, 并启动
docker run hello-world #测试是否成功 官方的测试镜像 docker info #查看信息 docker version #查看版本 docker search centos #查找centos镜像 # 第一个centos是官方的源 # 拉取官方镜像 docker pull centos # 下载好之后查看系统中的镜像 docker images # 启动镜像 docker run -v D:\:/home/tilesimage/D --privileged=true --name imagetiles -itd -p 80:80 33e204441716 /usr/sbin/init #这条命令为什么这么长 到底是什么意思 后面会说到
3.进入镜像,在镜像中植入各种依赖
#需要注意的是,这是一个新系统,里面除了yum其他什么都没有,非常干净,我们需要把所有的开发依赖全部安装上 yum update yum -y install wget yum install sudo yum groupinstall "Development Tools" yum install gcc gcc-c++ autoconf automake yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel yum install sqlite-devel yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel yum install psmisc -y
4.安装python3.6
#安装python3.6 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz #下载包 tar -zxvf Python-3.6.2.tgz #解压包 cd Python-3.6.2/ #进入解压出来的文件夹下 sudo mkdir /usr/local/python3 #创建文件夹 ./configure –-prefix=/usr/local/python3 #指定的安装路径 sudo make && sudo make install #在Python-3.6.2文件夹下直接安装 sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3 #执行软连接命令 sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #创建软连接 #安装django pip3 install django==2.2.4 #安装celery pip3 install celery==3.1.26.post2 #安装django-celery pip3 install celery == 3.2.2 #安装redis pip3 install redis == 2.10.6 #注意 这里有个坑 redis的版本不宜过高,不然的话启动含有celery的项目时会报错 #安装uwsgi pip3 install uwsgi
5.安装redis、Nginx、mysql
#安装redis
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -zxvf redis-5.0.3.tar.gz
cd redis-5.0.3
make
make install PREFIX=/usr/local/redis
cd /usr/local/redis/bin/
./redis-server
cp /usr/local/redis-5.0.3/redis.conf /usr/local/redis/bin/
vi redis.conf #在配置文件中将daemonize 后面改成 yes
./redis-server redis.conf
#设置开机启动
vi /etc/systemd/system/redis.service
### 在redis.service中加入以下内容
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
###
[root@localhost bin]# systemctl daemon-reload
[root@localhost bin]# systemctl start redis.service
[root@localhost bin]# systemctl enable redis.service
# 创建 redis 命令软链接
[root@localhost ~]# ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis
[root@localhost ~]# redis
127.0.0.1:6379 >
# 这里的systemctl本来是不可用的,这是docker的最高权限,为什么现在能用呢 再来看镜像的启动命令
# docker run -v D:\:/home/tilesimage/D --privileged=true --name imagetiles -itd -p 80:80 33e204441716 /usr/sbin/init
# 其中--privileged=true 和最后的/usr/sbin/init 这两句话是打开docker最高权限命令
#安装nginx #不同于云服务器 在docker容器中安装nginx是缺少SSL的,所以我们要先安装SSL yum install -y gcc gcc-c++ $ cd /usr/local/ $ wget http://www.openssl.org/source/openssl-1.1.1d.tar.gz $ tar -zxvf openssl-1.1.1d.tar.gz $ cd openssl-1.1.1d $ ./config $ make && make install #SSL安装好以后,安装nginx $ wget http://nginx.org/download/nginx-1.17.9.tar.gz $ tar -zxvf nginx-1.17.9.tar.gz $ cd nginx-1.17.9 $ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with- http_ssl_module $ make && make install #这里有三个坑 1.不出意外你会出现这个错 # make[1]: *** [objs/Makefile:473: objs/src/core/ngx_murmurhash.o] Error 1 # make[1]: Leaving directory ‘/root/nginx-1.10.1‘ # make: *** [Makefile:8: build] Error 2 解决方法:打开 nginx的安装目录/objs/Makefile,去掉CFLAGS中的-Werror,再重新make 2.出现第二个错误 # make[1]: *** [objs/Makefile:774: objs/src/os/unix/ngx_user.o] Error 1 # make[1]: Leaving directory ‘/root/nginx-1.10.1‘ # make: *** [Makefile:8: build] Error 2 解决方法:vim src/os/unix/ngx_user.c 找到第36行 注释掉 3.注意 注意 警告!!! 最好用最新的nginx版本和SSL版本 不然你会出现第四个错!!! # make[1]: *** [objs/Makefile:816: objs/src/event/ngx_event_openssl.o] Error 1 # make[1]: Leaving directory ‘/root/nginx-1.10.1‘ # make: *** [Makefile:8: build] Error 2 这个是openssl版本的原因,需要降低版本 建议直接用nginx和SSL高版本,这个错就不会出现了
#安装mysql
wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'
rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
yum install -y mysql-community-server
#启动服务
systemctl start mysqld
#查看服务状态
systemctl status mysqld
#查看数据库密码
grep 'temporary password' /var/log/mysqld.log
# 查询到的默认密码为:Zf6pDvC/E?j;
#然后利用这个密码进入mysql命令行 mysql -uroot -p查到的密码
SET PASSWORD = PASSWORD('Luwei123!');
#设置远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Luwei123!' WITH GRANT OPTION;
flush privileges;
# 进入到/etc/my.cnf修改配置信息(vim /etc/my.cnf)
#在[mysqld]下面添加,不需要分号
#字符集:注意是utf8而不是utf-8!
character-set-server=utf8
#这时候使用show variables like 'char%';就可以查看到字符集都是utf8了
#sql支持group by语句
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#设置时区为东八区
default-time_zone = '+8:00'
#重启服务
systemctl restart mysqld
#设置开机启动
systemctl enable mysqld
systemctl daemon-reload
6.将自己的项目从本地拷贝到docker,挂载宿主机的盘符
docker cp Django-luwei myCentos:/home/ # 因为我的项目需要访问宿主机的图片 所以我在docker中挂载了宿主机D盘 # 回看docker启动命令 docker run -v D:\:/home/tilesimage/D --privileged=true --name imagetiles -itd -p 80:80 33e204441716 /usr/sbin/init # -v D:\:/home/tilesimage/D 意思就是将D:\ 的所有文件夹 : 到docker的/home/tilesimage/D 文件夹下
7.为centos8配置中文语言包
# 不同于centos7 8的相对于更简单 # 首先查看当前字符集 locale # 看看有没有zh_CN.utf8 locale -a |grep CN # 没有就安装 yum install -y langpacks-zh_CN # 安装后再次确认配置 vi /etc/locale.conf LANG="zh_CN.UTF-8" #重启docker docker redtart 33e204441716
8.配置项目,映射端口
#现在整个系统中包含了 python3 mysql redis celery nginx uwsgi 当然,缺什么可以自行往里面安装添加 # 整个项目在docker中进行部署,跟平时服务器部署一样 # 部署完之后访问宿主机ip 123.45.67.12 发现可以正常访问项目 !注意:能通过浏览器访问docker是因为在启动docker时进行了端口映射 # 回看docker启动命令 docker run -v D:\:/home/tilesimage/D --privileged=true --name imagetiles -itd -p 80:80 33e204441716 /usr/sbin/init # -p 80:80 就是与本地的80端口进行映射
9.生成镜像,导出容器
exit #退出容器 docker stop 33e204441716 #停止容器 docker commit 33e204441716 luwei-docker #将容器生成名称为luwei-docker的镜像 docker images #此时查看镜像就会多出来一个,那就是你封装好的镜像 #导出镜像到本地D盘 docker save c7109f74d339 > D:\docker\images\luwei-docker.tar
等待导出完成,到D盘中查看就会发现镜像导出成功,此时换一台机器将镜像导入docker
docker load < D:\docker\images\luwei-docker.tar
启动之后发现运行正常,与第一台机器一模一样
