docker部署
docker
docker是一个开源的应用容器引擎,用于开发应用、交付(shipping)应用、运行应用,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到云服务器的Linux上。
docker容器是轻量级的虚拟机,可以将操作系统底层虚拟机化,而虚拟机则是虚拟化硬件
docker行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker
技术比虚拟机技术更为轻便、快捷。
优点:更快速的启动时间 统一环境,统一配置,可移植性
安装docker
去阿里云购买云服务器, 云服务器自带centos系统
1.如果你之前装过docker需要卸载
卸载命令:
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
# 新的安装:
1.首先安装docker相关依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.创建docker文件仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.使用阿里云下载docker
sudo yum install docker-ce -y
安装完毕 检查是否安装成功 docker -v
Docker version 23.0.3, build 3e7cbfd
常用命令
# 查看是否启动
systemctl status docker
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机自启动
systemctl enable docker
# 查看docker概要
docker info
# 远程仓库下载镜像 仓库地址:https://hub.docker.com
# 需要的软件都可以在这上面下载
镜像相关命令
# 1 查找镜像
建议去hub.docker.com 直接搜,更直观
# 2 下载镜像,指定标签 tag
docker pull redis
docker pull centos:7
docker pull mysql:5.7
docker pull python:3.8
如果不指定标签,会下载最新
# 3 查看本地镜像
docker images
# 4 删除镜像
docker rmi -f 镜像ID # 强制 删除一个镜像
容器相关命令
# 把镜像运行成容器,并且一个一个镜像,可以运行出多个容器
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 查看最后一次运行的容器
docker ps -l
# 创建容器/运行容器
-如果容器没有创建,直接执行run,就会创建并运行,所以你只需要会run就行了
-run 的时候,有很多参数
-i:表示运行容器
-t:表示容器启动后会进入容器命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)
--name :为创建的容器命名,如果不写,随机生成一个名字
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
# 创建容器
docker run -it --name=mycentos centos:7
# 容器名为mycentos 使用的镜像是centos:7
# 退出并关闭该容器
exit
# 进入某个容器
docker exec -it 容器id /bin/bash
# 直接就可以进入这个容器的终点 可以操作该容器了
# 启动容器
docker start 容器名/容器i
# 停止容器
docker stop 容器id号/容器名称
# 重启容器
docker restart 容器id号/容器名称
# 删除容器 需要先停止后删除
docker rm 容器id号/容器名称
# 直接让某个容器执行命令
docker exec 容器id 命令
# 查看某个容器运行日志
docker logs 容器id
# 查看容器下的进程
docker top 容器id
# 查看容器内的详细信息
docker inspect 容器id
# 查看某个容器的ip地址
sudo docker inspect 容器名 | grep "IPAddress"
# 文件拷贝 容器内文件复制到宿主机上
docker cp 20fd8:/django_file /home/django_file
docker cp 容器id:容器目录 需要拷贝的文件或目录
# 将id为20fd8容器里面的根目录下的django_file文件,复制到宿主机home文件下
docker cp ./django_file 20fd894a3f20:/home/django_file
docker cp 宿主机文件路径 容器名称:容器文件路径
# 宿主机文件复制到容器上
容器目录映射
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
# 将宿主机的目录映射到容器中 在创建容器的时候
docker run -it --name=moon11 -v /moon:/mymoon centos:7
# 把宿主机根目录下的moon 映射到 moon11容器的根目录下的mymoon中
eg:
docker run -it --privileged=true -v /host_data:/docker_data
--name=u1 myubuntu1.1
# 宿主机根目录下的host_data文件夹映射到容器内根目录docker_data
# 容器名称叫 u1 用的镜像是myubuntu1.1
这样两个目录双向绑定 任意端修改都会同步
'''
也可以设定读写权限 默认是又可以读又可以写
-v /host_data:/docker_data:ro
如果加 ro 就是只可以读 容器内不能写数据 只能读宿主机对于目录数据
'''
容器端口映射/继承映射
在容器中启动一个mysql5.7 让容器里3306端口 监听宿主机的3306
docker run -id --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 创建一个容器叫mysql 映射宿主机的3306 到 自己的3306 mysql密码为123456
# -e MYSQL_ROOT_PASSWORD=123456 这个参数只针对mysql
# 访问宿主机的80端口 相当于访问这个容器的 3306端口
# netstat -nlp |grep 80 查看本机80端口占用情况
然后就可以在本机上 直接用navicat 连接容器内的数据
连接地址是服务器的公网地址 用户root 密码123456 即可
然后你就可以在mysql这个容器中使用 mysql了
继承映射
docker run -it --privileged=true -v /host_data:/docker_data
--name=u1 myubuntu1.1
1.创建了容器 u1 并做了目录映射
2.创建容器 u2 继承u1的目录映射规则
docker run -it --privileged=true --volumes-from u1 --name=u2 myubuntu1.1
# docker run -it --privileged=true --volumes-from父类 --name=u2 myubuntu1.1
# 这个时候u2容器就也有对于的文件夹和数据
mysql/redis/nginx部署
mysql部署只需3步
1.宿主机内先创建文件夹
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
2.宿主机创建配置文件并写入内容
vim /home/mysql/my.cnf
my.cnf文件内容:
[client]
port=3306
default-character-set=utf8
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
3.创建一个mysql容器 并将数据文件映射到宿主机上
docker run -id -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name dockermysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 将 宿主机文件目录与容器内部文件目录映射
# 这样容器内的mysql数据也会同步保存在宿主机上
# 如果容器被删除 直接同样的命令可以再创建一个相同的容器并还有数据
4.这样你就可以在在容器中 创建表 创建库 数据都会在宿主机上
即使你的容器被删除了,你只需要再次启动一个容器,数据目录映射相同就可以了
部署nginx
1.宿主机:
# 在根目录下创建文件夹
mkdir html
cd html
上传shopweb项目
2.创建容器 并关联对应目录
docker run -id --name=nginx -p 80:80
-v /html/shopweb:/usr/share/nginx/html nginx
# shopweb(就是我的静态html文件夹)
# 这样访问宿主机的80端口 会直接显示容器内html文件内容
进入到容器的指定位置查看配置
cd /etc/nginx/conf.d/
通过查看得知
server {
listen 80;
# 监听了80端口
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
# 执行目录/usr/share/nginx/html
index index.html index.htm;
# 执行的文件index.html
}
所以我们只需要把我们的文件映射到/usr/share/nginx/html到这里即可
-v /html/shopweb:/usr/share/nginx/html
以后再上线前端内容,比如已经打包好了的vue代码,我们直接传到宿主机下的html文件中即可 完成
部署redis
1.宿主机下载redis镜像
docker pull redis
2.宿主机创建文件夹 mkdir /home/redisdata
3.编写配置文件 vim /home/redis.conf
bind 0.0.0.0
daemonize no
protected-mode no
requirepass 111222
# requirepass是redis的密码
4.创建容器 并运行redis
docker run -id -p 6379:6379 --name redis -v /home/redis.conf:/etc/redis/redis.conf -v /home/redisdata:/data redis redis-server /etc/redis/redis.conf
5.这样访问 远程连接宿主机地址的 6379端口 就是访问容器内的redis了
容器保存为新镜像
作用:比如我们拉取了centos:7的镜像,然后运行成了容器,我们在容器中装了python3.8 我们可以把这个容器再做成镜像
接下来以后,公司人都可以用这个镜像了
docker run -id --name centos_vim centos:7
1.运行一个centos:7的容器
docker exec -it a6e240 /bin/bash
yum install vim -y
yum install python3.8 -y
2.在容器中装vim + python3.8
3.再把容器保存为镜像
docker commit 容器id/名称 镜像名字:版本
# docker commit d8d4c4d2e1e9 moon1:1.1
# 这样就将一个容器打包成了镜像
'''
接下来比如把之前装有vim和python的容器删除了
再基于新的镜像创建容器 容器中就直接有了vim和python和其他所有
刚刚操作的文件了
最开始我们拉下来的centos:7这个镜像也可以删除了
'''
镜像打包备份
docker save -o centos_vim_image.tar centos_vim_image
# 把宿主机上的centos_vim_image镜像打包成一个压缩包
然后可以传给他其他人
docker load -i centos_vim_image.tar
将本地镜像上传到私有仓库
将本地生成的镜像上传到docker官方私有仓库
1.下载registry镜像
docker pull registry
2.然后百度即可
第二种: 使用 harbor 专业私有仓库服务
可视化界面 可百度了解
dockerfile
Dockerfile的命令
FROM 基础镜像 #基于哪个基础镜像来构建
MAINTAINER lqz # 声明镜像的创建者
EXPOSE 8080 # 需要暴露的端口
ENV key value # 设置环境变量 (可以写多条)
RUN command # 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file
#将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file
# 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR
# 设置工作目录,运行起这个容器,进入容器就是到这个目录
示例:构建一个带vim的centos镜像
1.vim Dockerfile
# 在宿主机上面创建一个Dockerfile文件
# Dockerfile文件内写入:
FROM centos:7
MAINTAINER lqz
ENV name lqz
RUN yum install vim -y
RUN mkdir /python
RUN touch /python/ss.py
RUN echo 'print(1)' >/lqz/ss.py
WORKDIR /python
2.基于dockerfile构建出一个镜像
docker build -t='centos_vim' .
# 这个.代表的是当前路径下的dockerfile文件
# 基于这个镜像运行容器
docker run -id --name xx centos_lqz_vim
# 进入到容器
docker exec -it xx /bin/bash
# 验证vim,和文件夹,文件是否存在
示范:使用dockerfile部署django项目
1.在python项目的根目录下编写 Dockerfile文件
2.编写dockerfile文件
FROM python:3.8
MAINTAINER moon.wu
WORKDIR /project
COPY ./requirements.txt /project/requirements.txt
RUN pip install -r requirements.txt
CMD ["python","manage.py","runserver","0.0.0.0:8080"]
# 一定要是双引号
# 说明:基于python:3.8基础镜像 在镜像内根目录下创建project 文件夹
# 把当前目录下的requirements.txt拷贝到容器内/project/requirements.txt
# 容器运行命令 pip install -r requirements.txt
# 当执行容器 run 命时 执行 "python","manage.py","runserver","0.0.0.0:8080"
3.把带有dockerfile的项目提交到git
4.在服务器上把代码拉下来
5.然后在项目目录中 执行命令 构建镜像
docker build -t='python_django' .
6.运行镜像 做成容器
docker run -id --name=django_books -v /python_project/docker_books-master:/project -p 8080:8080 python_django
7.部署成功 访问服务器 8080端口即可
# 记得服务器开启8080端口访问
'''
以后代码更新后
只需要在服务器上 再去拉取代码即可
'''
docker-compose
安装下载
1.官方下载地址:https://github.com/docker/compose/releases
选择:linux-x86_64版本
2.下载完成后把文件上传到
服务器的/usr/local/bin目录下,重命名为docker-compose
3.添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
4.测试是否安装成功
docker-compose --help
举例:flask+redis项目部署