从无到有封装一个Docker镜像

作者: admin 分类: 软件使用 发布时间: 2023-12-07 08:28

从无到有封装一个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

启动之后发现运行正常,与第一台机器一模一样

发表回复

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

标签云