python --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目录映射:配置文件和静态文件,项目文件)

完整部署流程如下:

  1. 创建nginx容器(方便把配置文件复制出来)

    docker run -it --name=nginx -p 80:80 -d nginx:1.2    
    
  2. 复制nginx配置文件到宿主机

     docker cp nginx:/etc/nginx/ /etc/nginx/
    
  3. 删除刚才创建的容器(开始正式创建);

     docker rm -f nginx
    
  4. 开始正式创建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.21

     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.21 
    
  5. 完事;

在已存在的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 命令来验证时区设置是否生效。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值