docker的优点和为什么要用,在这就不说了,或多或少都了解一些,直接进入正题。

0、基础概念

0.1 虚拟机 Virtual Machine

  • 定义:
    • 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统

  • 在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。
  • 每个虚拟机都有独立的 CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。

0.2 容器

  • 定义:
    • 将操作系统层虚拟化,是一个标准的软件单元
  • 优点:
    • 随处运行:容器可以将代码与配置文件和相关依赖库进行打包,从而确保在任何环境下的运行都是一致的。
    • 高资源利用率:容器提供进程级的隔离,因此可以更加精细地设置 CPU 和内存的使用率,进而更好地利用服务器的计算资源。
    • 快速扩展:每个容器都可作为单独的进程予以运行,并且可以共享底层操作系统的系统资源,这样一来可以加快容器的启动和停止效率。

0.3 虚拟机、容器的区别与联系

  • 虚拟机虽然可以隔离出很多「子电脑」,但占用空间更大,启动更慢。虚拟机软件可能还要花钱,例如VMWare;
  • 容器技术不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境,类似「沙箱」;
  • 运行空间,虚拟机一般要几 GB 到 几十 GB 的空间,而容器只需要 MB 级甚至 KB 级;
虚拟机容器
运行速度.更加快
运行空间.更加轻量
稳定性有牢固的边界
以防止应用程序突破它

一、Docker安装

D o c k e r 三 大 核 心 概 念 { 镜 像   I m a g e 镜 像 是 一 个 可 执 行 包 , 其 包 含 运 行 应 用 程 序 所 需 的 代 码 、 运 行 时 、 库 、 环 境 变 量 和 配 置 文 件 容 器   C o n t a i n e r 容 器 是 镜 像 的 运 行 时 实 例 仓 库   R e p o s i t o r y Docker 三大核心概念 \begin{cases} 镜像 \ Image \\ \qquad 镜像是一个可执行包,其包含运行应用程序所需的代码、运行时、库、环境变量和配置文件 \\ 容器 \ Container \\ \qquad 容器是镜像的运行时实例 \\ 仓库 \ Repository \end{cases} Docker Image Container Repository

  • Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎
  • 为什么 Docker 启动快?
    • 当我们请求 Docker 运行容器时,Docker 会在计算机上设置一个资源隔离的环境。
    • 然后将打包的应用程序和关联的文件复制到 Namespace 内的文件系统中,此时环境的配置就完成了。
    • 之后 Docker 会执行我们预先指定的命令,运行应用程序。
  • 为什么 Docker 各个进程相互独立?
    • Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。

1.1 在Ubuntu系统下安装

在Linux系统下安装需要确保Ubuntu的版本是64位,而且内核版本(uname -r )需大于3.10版

1. sudo apt-get update  # 更新一些包
''' Ubuntu的软件仓库里,Docker叫docker.io,原因是已经有别的软件先占据了Docker这个名字'''
2. sudo apt-get install docker.io 
''' 校验Docker服务的状态,确保Docker服务是启动的'''
3. service docker start
  • ( 1 ) 安 装 d o c k e r 时 , 默 认 的 安 装 位 置 是 / v a r / l i b / d o c k e r (1) 安装docker时,默认的安装位置是/var/lib/docker (1)docker/var/lib/docker
    查看文件的指令是:
sudo ls /var/lib/docker/
  • ( 2 ) 查 看 D o c k e r 是 否 安 装 成 功 (2) 查看Docker是否安装成功 (2)Docker
docker info

出现下面内容,表示安装成功。

 Debug Mode: false
Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 0
 Server Version: 19.03.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.15.0-117-generic
 Operating System: Ubuntu 16.04.6 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 7.648GiB

可能遇到的错误

报错提示1:

启动Docker的过程中提出如下错误
‘Failed to start docker.service: Interactive authentication required.
See system logs and ‘systemctl status docker.service’ for details.’
错误原因:权限不足
解决方案: sudo service docker start

1.2 在Centos系统下安装

前提:内核版本需要不小于3.10,不然docker起不来
uname   -r   查看当前内核版本
  • 方法一
yum install docker -y   # 安装Docker服务,-y代表默认安装
service docker start
service docker stop
service docker restart
  • 方法二
1.安装docker的依赖包
yum install -y yum-utils lvm2 device-mapper-persistent-data

2.配置docker源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3.可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates   |   sort   -r

4.安装
yum -y install docker-ce-18.03.0.ce

5.重启docker
chkconfig docker on   ### 开机启动
service docker start     ###启动docker

1.2.1 Docker 加速器可以使安装Docker的镜像的速度更快

# 配置Docker加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

修改 /etc/docker/daemon.json文件,去掉结尾的逗号。

二、Docker 卸载

sudo apt-get remove docker
sudo apt-get remove --auto-remove docker
sudo apt-get autoremove --purge

三、Docker配置

操 作 流 程 : { ( 1 ) 先 下 载 镜 像 ( 2 ) 为 镜 像 创 建 容 器 ( 3 ) 在 容 器 里 面 部 署 程 序 操作流程: \begin{cases} (1)先下载镜像\\ (2)为镜像创建容器 \\ (3)在容器里面部署程序 \\ \end{cases} 123

3.1 创建容器

这里直接说如何创建一个容器,下面是关于这部分的具体介绍

service docker start # 启动Docker服务

docker pull python   # 下载镜像

# 创建容器,-p 9500:5000 端口映射,(可选)
# -v /home/jankin/project:/home/project   地址映射, (可选)
# --net mynet --ip 172.18.0.2   固定Ip设置(可选)
# Python 镜像的名字 
# bash 进入容器后,命令行显示
docker run -it --name=p1 -p 9500:5000 -v /home/jankin/project:/home/project --net mynet --ip 172.18.0.2 python bash  

四、Docker内容的具体解析

4.1、镜像

镜像是一个配置好的只读层软件环境。
有两种方式可以得到Docker镜像:
(1)通过dockerfile文件创建出镜像。
(2)从Docker仓库中下载镜像。

4.1.1 通过dockerfile文件创建

创建dockerfile文件
创建镜像
cd /home/jankin/DockerEnv

docker build -t python_ubuntu .
  • 错误1:“invalid argument “face” for “-t, --tag” flag: invalid reference format: repository name must be lowercase
    See ‘docker build --help’.”
    报错原因:名字中存在大写字母
    解决方法:改成小写字母就好。
  • 错误2:“ “docker build” requires exactly 1 argument.”
    报错原因:名称后边少了一个 .
# USAGE
docker build [OPTIONS] PATH | URL | -
# e.g.
docker build .

这里的PATH指明了是.

4.1.2 从仓库中下载镜像

docker pull python:3.5

4.2 容器

  • 容器是在镜像基础上创建出的虚拟实例,内容可读可写。
    一个Docker镜像可以创建出多个容器,而且容器之间相互隔离,部署的程序不会相互干扰。
  • Docker速度非常快。
    因为所有的容器直接使用宿主机的Linux内核、内存和硬盘,所以容器的性能非常接近于宿主机。
    在这里插入图片描述
# 创建容器
docker run -it --name=p1 python:3.8 bash

4.3 Docker 网络管理

给docker分配 固定的网络ip
每一个服务给一个固定的网段,比如python分配在172.18.0.0,MySQL分配在172.19.0.0

docker network create --subnet=172.18.0.0/16 mynet  # 创建Docker内部的网段

docker network ls # 查看都存在哪些网段

docker network rm mynet  # 删除

docker run -it --name=p1--net mynet --ip 172.18.0.2 python:3.8 bash

# 查看ip是否为我们命名的ip
ip addr

4.4 Docker端口映射

为什么要做端口映射?
默认情况下,除了宿主机之外,任何主机无法访问远程访问Docker容器。
通过端口映射,可以把容器端口映射到宿主机的端口,这样其他主机就能访问容器了。

docker run -it --name p1 -p 9500:5000 python:3.8 bash
# 将容器的 5000 端口映射到宿主机的 9500 端口

docker run -it --name p1 -p 9500:5000 -p 9600:3306 python:3.8 bash
# 多个端口映射

docker ps -a  # 查看状态

4.5 目录挂载技术

docker容器中的文件是与外界隔离的,所以为了能把一部分业务数据保存在Docker环境之外,或者把宿主机的文件传入容器,所以需要给容器挂载宿主机的目录。

  • Docker环境只支持目录挂载,不支持文件挂载
  • 一个容器可以挂载多个目标
docker run -it --name=p1 -v /home/jankin/test:/test python:3.8 bash
# 冒号前面是宿主机文件路径,冒号后面是docker容器文件路径

4.6 Docker常用命令

在这里插入图片描述

4.6.1 镜像的常用命令

命令 含义
创建镜像 pull 下载镜像
push 上传镜像
search 查找相关镜像镜像
查看相关信息 images 列出本地Docker环境下的所有镜像
inspect 查看某个镜像的信息
删除镜像 rmi 删除某个镜像
上传与加载 save 镜像中的内容导出成压缩文件
load 加载安装
1. 创建镜像

(1)写好Dockerfile 文件之后,通过build命令创建镜像。
(2)从Docker Hub仓库中下载镜像
search — 查找相关镜像
pull — 下载镜像
push — 上传镜像

2. 查看信息

(1)images 列出本地Docker环境下的所有镜像
(2)inspect 查看某个镜像的信息

3. 删除

rmi 删除某个镜像

注意:要删除的镜像没有关联容器,否则只能先删除容器再删除镜像。

4. 分享到其他主机

(1)上传到Docker仓库,然后下载安装。
(2)通过save导出成压缩文件,-- 通过U盘导入到其他机器上, – 然后通过load指令加载安装。

举个例子

下面举一个列子简单介绍一下

service docker start  # 启动docker

docker pull python:3.8  # 下载python3.8的镜像

docker images   # 查看都有哪些镜像

docker inspect python:3.8  # 查看具体的镜像信息

docker save python:3.8 > /home/jankin/python.tar  # 将python3.8的镜像导出为压缩文件 

docker rmi python:3.8  # 删除镜像

docker load < /home/jankin/python.tar  # 从压缩文件中导入镜像

4.6.2 容器的常用命令

命令 含义
运行 run 创建并运行容器
exec; attach 进入正在运行的容器
exit 退出容器
start 退出之后的启动容器
暂停 pause 暂停容器
unpause 取消暂停
查看 ps 查看状态
inspect 查看详细信息
删除 rm 删除“已停止”容器
容器转为镜像 commit 将容器转为镜像
1. 运行

(1)run 创建并运行容器
(2)exec;attach 都可以进入已运行的容器中,【推荐使用exec】

2. 暂停

(1)pause 暂停容器
(2)unpause 取消暂停

3. 查看状态

(1) ps 查看状态
(2)inspect 查看详细信息

4. 删除

rm 删除“已停止”容器

5. 容器转为镜像

commit 将容器转为镜像

# 查询容器id
docker ps -a

# 容器转换成镜像,只用复制id前几位就可以了
# 注意:镜像名要小写
docker commit 容器id 设置打包为镜像的名字:版本号

#容器转为压缩文件
docker save -o 压缩文件名称 镜像名称:版本号

# 加载压缩文件
docker load -i 压缩文件名称

举个例子

下面举一个列子简单介绍一下上述指令:

# "-it" 交互命令,创建容器之后可以和容器交互
# --name 容器的名字
# python3.8   调用哪个镜像
# bash  调用哪个程序,“bash”指的是命令行运行
docker run -it --name=p1 python:3.8 bash

docker run -it -d --name=p1 python:3.8 bash  # “-d”的作用是:执行exit命令时,不会停止容器

exit  # 退出容器

docker ps -a # 查看docker容器的信息

docker start p1  # 启动docker 容器

docker pause p1  # 暂停docker容器
docker unpause p1  # 暂停之后的启动docker容器

docker exec -it p1 bash   # 进入“p1”容器

docker inspect p1  # 查看容器“p1”的具体信息

docker stop p1  # 停止容器
docker rm p1  # 删除容器

docker commit 

服务发布

不能将源代码发布上去,编译之后发布.pyc文件。

参考资料

Docker教程:使用docker配置python开发环境
Docker构建Python web环境-NEXT学院×腾讯云大学
Docker 入门终极指南,别再说不会用Docker了!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐