python --docker(部署问题、无网安装)
docker深入浅出详解
docker和vmware对比
vmware是轻量级虚拟机,只虚拟了少量的硬件设备,虚拟实例共享使用Linux内核
安装docker
关闭SELINUX服务
SELINUX是CentOS系统捆绑的安全服务程序,因为安全策略太过严格,所以建议大家关闭这项服务
打开 vim /etc/selinux/config
修改 SELINUX=disabled
reboot 重启系统
使用yum命令安装docker服务
yum install docker -y # 安装docker服务, -y 默认安装
基本命令(启动、关闭、重启)
service docker start # 启动docker
service docker stop # 停止docker
service docker restart # 重启docker
什么是DockerHub
DockerHub是Docker公共镜像仓库,为用户提供了大量的镜像文件
https://hub.docker.com/
由于国内网络访问DockerHub很慢,无法下载镜像文件,我们可以使用Docker加速器
打开dockerhub 在搜索框输入python
配置docker加速器
DaoCloud加速器采用自主研发的智能路由及缓存技术,并引入了先进的协议层优化,极大提升拉取镜像的速度和体验
安装命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
或
科大镜像:https://docker.mirrors.ustc.edu.cn/
网易:https://hub-mirror.c.163.com/
阿里云:https://<你的ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com
出现这个即为执行成功
vim /etc/docker/daemon.json 去掉结尾逗号
service docker restart 重启
加速器配置2:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://owt61vde.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker环境常用指令
实操:
镜像相关命令
启动docker
service docker start
下载指定版本的python镜像
docker pull python:3.7
查看已经安装好的docker镜像
docker images
查看已经安装的docker镜像中的详细信息
docker inspect python:3.7
把已安装的镜像保存为压缩文件
docker save python:3.7 > /root/python.tar
删除掉已经存在的docker镜像(该镜像必须未绑定容器)
docker rmi python:3.7
从压缩包安装py镜像(适用无网环境)
docker load < /root/python.tar
容器相关命令
查看正在运行的docker容器
docker ps
docker ps -a
创建容器
docker run -it --name=p1 python:3.7 bash
-it: 创建后立即执行
--name: 容器名称(随意起名)
python:3.7 根据那个镜像创建容器;
bash 创建后要执行什么;
-d 参数可以让容器默认后台运行,后面用exec命令进去容器
启动、停止、暂停容器
docker start p1 启动
docker stop p1 停止
docker pause p1 暂停
docker unpause p1 恢复
进入正在运行的容器中
docker exec -it p1 bash # 该容器必须是运行状态
docker attach 容器id
退出容器
exit 注: 如果是run命令进去exit后则容器停止,如果是exec命令进入则容器运行状态不变
查看容器详细信息
docker inspect p1
删除容器
docker rm p1 # 该容器必须是停止状态
容器网络环境
docker 网络环境
默认情况下,docker环境会给容器分配动态的IP地址,这就导致下次启动容器的时候IP地址就改变了
我们可以单独创建一个docker内部的网段,(默认是172.17.0.x),为了方便区分,所以用网段区分一下
创建固定网段
docker network create --subnet=172.18.0.0/16 mynet
16: 分配的ip最大值
mynet: 网段名
删除网段
docker network rm mynet # 必须把该容器删掉
创建容器并分配固定ip
docker run -it --name=p1 --net mynet --ip 172.18.0.2 python:3.7 bash
查看docker环境中所有的网段
docker network ls
容器端口映射
默认情况下,除了宿主机之外,任何主机无法访问远程访问docker容器,通过端口映射,可以把容器端口映射到宿主机的端口,这样其他主机就能访问容器了,映射到宿主机的端口,不需要设置防火墙规则,便可以使用(可以把多个端口映射的宿主机上)
命令如下:
docker run -it -p 9500:5000 --name=p1 python:3.7 bash
把容器5000映射到宿主机的9500端口
docker ps -a 可以查看一下
docker目录挂载(目录映射)
为了能把一部分业务数据保存在docker环境之外,或者把宿主机文件传入容器,所以需要给容器挂在宿主机的目录
docker环境只支持目录挂载,不支持文件挂载,而且一个容器可以挂载多个目录
命令如下:
实操:
mkdir test 在/root/目录创建一个test目录
cd test 进入test目录
touch 1.txt 在test目录创建1.txt文件
docker run -it -v /root/test:/root/test --name=p1 python:3.7 bash 容器挂载
cd /root/test/ 进入容器test文件
ls 查看容器中的文件
touch 2.txt 在容器中创建2.txt
exit 退出容器
cd test 并 ls 可以看到宿主机也有2.txt文件
实操部署flask
1. 宿主机创建项目文件夹;
mkdir test
2. 创建docker镜像,挂载目录并映射端口
docker run -it -d --name=p1 -p 9500:5000 -v /root/test:/root/test --net mynet --ip 172.18.0.2 python:3.7 bash
3. 查看容器运行情况;
docker ps -a
4. 进入p1容器
docker exec -it p1 bash
5. 安装项目依赖
pip insall flask ...
6. 拉取mysql镜像并创建mysql容器
docker pull mysql:8.0.18 指定版本,如果不指定则是最新镜像
docker run --name m1 -p 4306:3306 --net mynet --ip 172.18.0.3 -v /root/test:/var/lib/mysql -e
MYSQL_ROOT_PASSWORD=Admin123. -d mysql
#为了保证数据安全,需要把数据库的文件挂载到宿主机上,删掉容器后也不会影响
或
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0.23
账号root 密码 root
# 登陆mysql服务
docker exec -it mysql bash # 退出用exit
mysql -uroot -proot
docker update mysql --restart=always # 设置mysql开机自启动(可选)
docker container logs mysql # 查mysql启动时的日志
centos 8安装docker报错
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Error: open /proc/self/uid_map: no such file or directory
解决办法:
1,卸载podman软件(可以使用rpm -qa|grep docker)
yum remove docker
2,下载docker-ce源
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
3,安装docker-ce
yum install docker-ce -y
问题原因分析:
Centos 8使用yum install docker -y时,默认安装的是podman-docker软件
docker项目制作镜像(导入无网环境使用)
-
docker pull python:3.6 拉取镜像
-
docker run -it -name=p1 -v 宿主机目录:容器目录 python:3.6 /bin/bash 创建容器并进入该容器
docker run -it -p 8001:8001 -v /root/project/code/game_resources:/root/game_resources --name=p1 python:3.7 bash -
pip install reqxxxx -i https://pypi.tuna.tsinghua.edu.cn/simple 安装项目中第三放包
-
exit 退出容器
-
docker commit 刚才的id 打包镜像的名称:3.6;如: (docker commit 29ee0479770b python_diy:3.6)
-
docker save 刚提交的镜像:3.6 |gzip > 导出的路径.tar.gz;如:(docker save python_diy:3.6 |gzip > python_images.tar.gz)
此时镜像已经制作成功
开始导入镜像
- docker load < tar 包所在路径;如:(docker load < /root/gf/python_images.tar.gz)
- docker run -it -name=p1 -v 宿主机目录:容器目录 python_diy:3.6 /bin/bash
docker安装mysql
- docker pull mysql:5.7
- docker run \
-p 3306:3306 --name mysql
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=Admin123. \
-d mysql:5.7
配置端口映射:
-p 3306:3306 --name mysql
将容器的3306端口映射到主机的3306端口
配置mysql数据卷挂载
1.-v /mydata/mysql/log:/var/log/mysql(日志文件挂载)
将容器中的日志文件夹挂载到主机对应的/var/log/mysql文件夹中
2.-v /mydata/mysql/data:/var/lib/mysql(数据文件挂载)
将容器中的数据文件夹挂载到主机对应的/var/lib/mysql文件夹中
3.-v /mydata/mysql/conf:/etc/mysql(配置文件挂载)
将容器的配置文件夹挂载到主机对应的/etc/mysql文件夹中
注(这里所提的主机指的是当前的linux主机)
配置用户并设置初始化root用户的密码
-e MYSQL_ROOT_PASSWORD=root
指定镜像资源
-d mysql:5.7
-d:以后台方式运行实例
mysql:5.7:指定用这个镜像来创建运行实例
安装redis
docker run --name redis -p 54321:6379 -v /etc/redis:/data -e REDIS_PASSWORD=Admin123. -d redis:5.0.5
安装nginx
- docker pull nginx:latest
- docker run -it --name=ng -p 80:80 -d nginx:lates
(注加上-v目录映射:配置文件和静态文件,项目文件)
完整部署流程如下:
-
创建nginx容器(方便把配置文件复制出来)
docker run -it --name=nginx -p 80:80 -d nginx:1.2
-
复制nginx配置文件到宿主机
docker cp nginx:/etc/nginx/ /etc/nginx/
-
删除刚才创建的容器(开始正式创建);
docker rm -f nginx
-
开始正式创建nginx容器;
docker run -it
-v /etc/nginx/:/etc/nginx/
-v /root/project/static/:/root/project/static/
-p 80:80
-p 443:443
–restart=unless-stopped
–name=nginx
-d nginx:1.21docker run -it -v /etc/nginx/:/etc/nginx/ -v /root/project/static/:/root/project/static/ -p 80:80 -p 443:443 --restart=unless-stopped --name=nginx -d nginx:1.21
-
完事;
在已存在的docker容器中安装vim
大多数基于 Debian/Ubuntu 的容器中,可以运行以下命令来安装 Vim:
apt-get update
apt-get install -y vim
自动启动容器命令
Docker容器的重启策略
Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。
Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。
Docker容器的重启策略如下:
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
示例:
docker run --name mysql -d -p 3306:3306 --restart unless-stopped -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
创建容器时没有添加参数 --restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动。
Docker 命令修改
docker container update --restart=always 容器名字
无网安装docker
下载rpm包
Docker CE 安装包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.8-3.el7.x86_64.rpm
Docker CE CLI 安装包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.8-3.el7.x86_64.rpm
containerd.io 安装包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm
安装依赖包,例如:
rpm -ivh docker-ce-cli-19.03.8-3.el7.x86_64.rpm
rpm -ivh containerd.io-1.2.13-3.1.el7.x86_64.rpm
安装 Docker,例如:
rpm -ivh docker-ce-19.03.8-3.el7.x86_64.rpm
启动 Docker 服务,例如:
systemctl start docker
验证 Docker 是否安装成功,例如:
docker version
如果能够输出 Docker 版本信息,则说明 Docker 安装成功。
注意:在无网环境下安装 Docker,可能会遇到依赖包缺失、版本不匹配等问题,需要根据具体情况进行调整。
报错处理:
警告:containerd.io-1.2.13-3.1.el7.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 621e9f35: NOKEY
错误:依赖检测失败:
container-selinux >= 2:2.74 被 containerd.io-1.2.13-3.1.el7.x86_64 需要
解决: [root@iZt4nglb5p7ah5ohcznotkZ docker]# yum install container-selinux
docker 端口和使用主机网络模式
在Docker中,可以使用主机网络模式来共享主机的网络命名空间,使容器能够使用主机的网络设置和端口。要使用主机网络模式,可以在创建容器时使用--network=host
参数。例如:
docker run --network=host <image_name>
使用主机网络模式后,容器将直接使用主机的网络接口,可以通过主机的IP地址和端口访问容器中运行的应用程序。这意味着容器的网络设置将与主机完全一致,包括IP地址、端口映射等。
需要注意的是,使用主机网络模式会导致容器与主机紧密耦合,并且容器将无法使用Docker提供的网络隔离功能。因此,在使用主机网络模式时需要谨慎考虑安全性和隔离性的问
docker中装vim与wget
装vim
apt-get update
apt-get install vim
装wget
apt-get install -y wget
将docker容器中的文件复制到宿主机
docker cp <容器ID或名称>:<容器内路径> <宿主机路径>
示例:
docker cp p1:/usr/local/lib/python3.7/site-packages/rest_framework_swagger/templates/rest_framework_swagger/index.html /root/project
将宿主机文件复制进容器
docker cp /path/to/host/file container_id:/path/inside/container
- /path/to/host/file是宿主机上要复制的文件的路径。
- container_id是目标容器的ID或名称。
- /path/inside/container是容器内要将文件复制到的路径。
例如,假设要将宿主机上的/opt/example.txt文件复制到名为my_container的容器的/data目录下,可以使用以下命令:
docker cp /opt/example.txt my_container:/data
docker中时区设置
要在已运行的 Docker 容器中设置时区,可以通过以下步骤进行操作:
首先,查找要设置时区的容器的 ID 或名称。使用以下命令列出正在运行的容器:
docker ps
找到你要设置时区的容器的 ID 或名称。
进入容器的交互模式。使用以下命令进入容器:
docker exec -it <container_id_or_name> bash
将 <container_id_or_name> 替换为你要设置时区的容器的实际 ID 或名称。
在容器内部,首先安装 tzdata 包,该包包含时区信息。使用以下命令安装:
apt-get update
apt-get install -y tzdata
如果你的容器使用的是不同的 Linux 发行版,可能需要使用相应的包管理器进行安装,例如 yum。
设置时区。运行以下命令来设置时区:
ln -sf /usr/share/zoneinfo/区域/城市 /etc/localtime
echo "区域/城市" > /etc/timezone
将 区域 替换为你所在的区域,将 城市 替换为你所在的城市。例如,对于中国上海的时区,可以使用以下命令:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
退出容器的交互模式。输入 exit 命令退出容器。
现在,你的 Docker 容器的时区应该已经成功设置。你可以通过在容器内运行 date 命令来验证时区设置是否生效。
更多推荐
所有评论(0)