Python---Docker容器基础入门

Docker

1 Docker简介

1.1 什么是虚拟化

  在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服务器、网络、内存及存储等)予以抽象、转化后呈现出来, 打破实体间不可切割的障碍,使用户可以通过更好的方式来应用这些资源。

  • 在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用。
  • 虚拟化的种类有很多,例如:
    • 软件虚拟化:Vmware软件、KVM软件、VirtualBox软件等
    • 硬件虚拟化: 磁盘阵列RAID、逻辑卷LVM、
    • 内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等。

1.2 什么是Docker

  Docker是一个开源的应用容器引擎, 诞生2013年,最初是dotCloud 公司内部的一个业余项目。它基于Google公司推出的Go语言实现。 项目后来加入Linux基金会,遵从了Apache2.0协议,源代码托管在 Github 进行维护。
在这里插入图片描述  Docker自开源后受到广泛的关注和讨论,以至于dotcloud公司后来都改名为Docker Inc。Redhat已经在RHEL6.5中集成对Docker的支持, Google 也在Paas产品中广泛应用。

  • Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在2018年之前是不支持在Windows系统部署Docker的。
  • 在LXC的基础上Docker做了进一步的封装,让用户不需要去关心容器的管理,使操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
  • 为什么选择Docker?
    • 上手快
      用户只需要几分钟,就可以把自己的程序"Docker化"。Docker依赖于"写时复制"(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到"随心所欲,代码即改"的境界。
      随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

    • 职责的逻辑分类
      使用Docker,开发人员只需要关心容器中优秀的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种"开发时一切正常,肯定时运维的问题(测试环境都是正常的, 上线后出了问题就归结为肯定是运维的问题)"。

    • 快速高效的开发生命周期
      Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从盒子里一件一件的取)。

    • 鼓励使用面向服务的架构
      Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或者进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器。从而使分布式部署应用程序,扩展和调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,一个程序中可以运行多个应用程序)。

1.3 容器和虚拟化的比较

下面的图片比较了Docker和传统的虚拟化方式的不同之处,可见容器在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的虚拟化则是在硬件层面实现。
在这里插入图片描述
总结: 与传统的虚拟机相比,Docker的优势体现为启动速度快、占用体积小。
知乎上看到一个更加形象的例子:

  • 物理机
    在这里插入图片描述

  • 虚拟机
    在这里插入图片描述

  • 容器
    在这里插入图片描述

1.4 Docker组件

1.4.1 Docker服务器与客户端

Docker是一个客户端/服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。

  • Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。
  • 用户可以在同一台宿主机上运行Docker守护进程和客户端。
    在这里插入图片描述
1.4.2 Docker镜像与容器
  • 仓库:每个仓库存放某一类镜像。
  • 镜像:类似虚拟机镜像(eg:xxx.iso)。 eg: MySQL镜像、Redis镜像、2048镜像
  • 容器:类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
1.4.3 Registry(注册中心)

Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。

  • 公有仓库 :所有人可以访问下载镜像的仓库。Docker公司运营公共的Registry叫做Docker Hub。
  • 私有仓库: 规定范围内可以访使用的库。用户可以构建私有的Registry。

2 Docker的安装与启动

2.1 安装Docker

我们学习的环境都使用的是RedHat, 因此这里我们将Docker安装到RedHat上。 注意: 这里建议安装在RedHat 7.x以上的版本。在RedHat6.x的版本中,需要安装其他很多的环境而且Docker很多补丁不支持更新。

首先得安装一下docker的环境,针对你的系统看一下docker的官网 吧, 下面是Linux系统的安装步骤。

2.1.1 修改redhat源为centos7的yum源

1、 阿里安装软件镜像源下载
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2、编辑repo文件
$ vim /etc/yum.repos.d/CentOS-Base.repo

将所有的$releaseve替换成7,使用vim里面的替换

:%s/$releasever/7/g

修改后内容为:

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
 
[base]
name=CentOS-7 - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
        http://mirrors.aliyuncs.com/centos/7/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#released updates
[updates]
name=CentOS-7 - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/7/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-7 - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/7/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-7 - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/7/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#contrib - packages by Centos Users
[contrib]
name=CentOS-7 - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/7/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

3、清理yum缓存,使设置生效

yum clean all

4、将服务器上的软件包信息缓存到本地,以提高搜索安装软件的速度。

yum makecache

5、yum包更新

yum update # yum包更新
2.1.2 安装Docker-ce

1、移除原来docker版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、配置yum仓库安装Docker

$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3、安装Docker
这里可以指定版本,也可以不指定,不指定版本默认是最新版本,可能会产生Docker版本和操作系统版本不兼容的问题,解决方法:

  1. 升级系统版本
  2. 降低Docker版本
yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io

4、安装后查看Docker版本

$ docker -v

5、启动Docker

$ systemctl  start	docker

2.2 Docker的启动与停止

systemctl命令是系统服务管理器指令。
1、启动Docker:

$ systemctl  start	docker

2、停止Docker:

$ systemctl  stop	docker

3、重启Docker:

$ systemctl  restart	docker

4、查看Docker状态:

$ systemctl	status docker

5、开机启动Docker:

$ systemctl	enable docker

6、查看Docker概要信息:

$ docker info

7、查看Docker帮助文档:

$ docker --help

3 常用命令

3.1 镜像相关命令

3.1.1 查看镜像
$ docker load -i game2048.tar		# 从tar包载入镜像
$ docker pull tensorflow/tensorflow	# 从镜像仓库拉取镜
$ docker images						# 查看镜像
  • REPOSITORY: 镜像名称
  • TAG: 镜像标签
  • IMAGE ID: 镜像ID
  • CREATED: 镜像创建的时间(不是获取该镜像的日期)
  • SIZE: 镜像大小
    这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。
3.1.2 搜索镜像

如果你需要从网络中查找需要的镜像,可以通过下面命令搜索:

$ docker search 镜像名称
3.1.3 拉取镜像

拉取仓库就是从镜像仓库中下载镜像到本地。

docker pull 镜像名称
3.1.4 删除镜像

按ID删除镜像

docker rmi 镜像ID

删除所有镜像(注意:``是反向单引号)

docker rmi `docker images -q`

在这里插入图片描述

3.2 容器相关命令

3.2.1 查看容器

查看所有正在运行的容器

docker ps

查看所有容器(即无论是否运行中)

docker ps -a

查看最后一次运行的容器

docker ps -l

查看停止的容器

docker ps -f status=exited
3.2.2 创建与启动容器

创建容器常用参数说明: docker run

  • -i, --interactive : 表示运行容器
  • -t, --tty : 表示容器启动后进入其命令行(分配一个伪终端)
  • –name : 指定容器名称
  • -v, --volume list : 表示一个/多个目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)
  • -d, --detach : 创建一个守护进程在后台运行
  • -p, --publish list : 表示一个/多个端口映射,前者是宿主机端口,后者是容器内的映射端口。

(1) 交互式创建容器

$ docker load -i ubuntu.tar			# 加载镜像
$ docker run -it --name=myubuntu  ubuntu /bin/bash	# 创建容器, exit退出当前容器
$ docker ps -a				# 查看容器

(2) 守护方式创建容器

$ docker run -di --name=容器名称 镜像名称:标签		# 创建容器
$ docker exec -it 容器名称/容器ID /bin/bash		# 登录守护容器交互环境的方式
项目案例: 基于Docker构建2048游戏项目
docker search 2048
docker pull docker.io/blackicebird/2048
docker run -di --name 2048 -p 0.0.0.0:8000:80 docker.io/blackicebird/2048

浏览器访问网址: http://127.0.0.2:8000, 访问效果如下:

在这里插入图片描述

3.2.3 停止与启动容器

停止容器:

docker stop 容器名称(或者容器ID)

启动容器:

docker start 容器名称(或者容器ID)

docker start 2048_game
3.2.4 文件拷贝

如果我们需要将文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或者目录 容器名称:容器目录

docker cp /etc/passwd   容器id:/tmp/	#将passwd拷贝到容器的/tmp/目录下

也可以将目录从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或者目录
项目案例: 基于Docker构建TF环境实现文件拷贝
$ docker pull	tensorflow/tensorflow	# 从镜像仓库拉取镜像
$ docker run -di --name tf tensorflow/tensorflow # 创建容器
$ docker cp /etc/passwd	tf:/mnt/	# 将文件拷贝到容器/mnt/目录下
$ docker exec  -it	tf /bin/bash	# 登录守护容器交互环境的方式查看
3.2.5 目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主主机某个目录的文件从而影响容器。

创建容器,添加-v参数 后面为 宿主机目录: 容器目录,例如:

$ docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name myubuntu1 ubuntu
$ docker exec -it myubuntu1 /bin/bash
root@8e80ee93f4e1:/# cd /usr/local/myhtml/
root@8e80ee93f4e1:/usr/local/myhtml# ls
test

如果你共享的是多级的目录,可能会出现权限不足的提示。

这是因为Redhat7的安全模块Selinux把权限禁掉了, 我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。

3.2.6 查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据,myubuntu1是容器的名称。

$ docker inspect  myubuntu1

也可以执行下面的命令直接输出IP地址,myubuntu1是容器的名称

$ docker inspect  --format='{{.NetworkSettings.IPAddress}}' myubuntu1
3.2.7 删除容器

删除指定的容器,如果删除容器时,容器正在运行中,则先停止容器。

$ docker stop  myubuntu1
$ docker rm  myubuntu1

4 应用部署

4.1 MySQL部署

  • 拉取MySQL镜像
$ docker search mysql
$ docker pull mysql
  • 创建容器
$ docker run -di --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD='123' mysql	
# 查看容器IP,IP: 172.17.0.2
$ docker inspect  --format='{{.NetworkSettings.IPAddress}}' mysql

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口。
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码

  • 进入MySQL容器并登录MySQL
$ docker exec -it mysql /bin/bash
root@664bda0fe52a:/# mysql -uroot -p123
 # 创建用户westos,允许任意主机(%)远程登陆,登陆密码为123.
mysql> create user westos@'%' identified by '123';
 # 授权westos@%用户, 允许操作任意数据库和任意数据表(*.*).
mysql> grant all privileges on *.* to 'westos'@'%';
 # 修改账户密码加密规则并更新用户密码。
mysql> alter 'westos'@'%' identified with mysql_native_password by '123';
 # 重新加载用户授权表。
mysql> flush privileges;
mysql> ^DBye
root@664bda0fe52a:/# exit

远程登录MySQL

$ mysql -uwestos -p123 -h172.17.0.2
报错处理:
  • 报错显示:
    用户在连接MySQL数据库时会出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。
[root@foundation0 ~]# mysql -uwestos -p123 -h172.17.0.2 -p3307
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be
loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared
object file: No such file or directory
  • 报错原因:

    • mysql8 之前的版本中加密规则是 mysql_native_password
    • 而在mysql8之后,加密规则是 caching_sha2_password
  • 解决方法: 修改账户密码加密规则并更新用户密码

# 修改加密规则
> ALTER USER 'user'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
# 更新一下用户的密码
> ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

5 迁移与备份

5.1 容器保存为镜像

我们可以通过以下命令将容器保存为镜像

$ docker commit mysql  mysql:remote_login

5.2 镜像备份

我们可以通过下面命令将镜像保存为tar文件

$ docker save -o mysqlRemoteLogin.tar mysql:remote_login

5.3 镜像恢复与迁移

$ docker load -i mysqlRemoteLogin.tar

-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复。

6 Dockerfile

6.1 什么是Dockerfile

Dockerfile由多条指令组成,每条指令在编译镜像时执行相应的程序完成某些功能,由指令+参数组成,以逗号分隔,#作为注释起始符,虽说指令不区分大小写,但是一般指令使用大些,参数使用小写

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。’#’ 为 Dockerfile 中的注释。

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境。
  • 对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。
  • 对于运维人员: 在部署时,可以实现应用的无缝移植。

6.2 常用命令

在这里插入图片描述

FROM : 指定基础镜像,要在哪个镜像建立
格式为 FROM <image> 或FROM <image>:<tag> 。

第一条指令必须为 FROM 指令。FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(CentOS和Ubuntu有些命令可是不一样的)。FROM命令可以多次使用,表示会创建多个镜像。

MAINTAINER:指定维护者信息
格式为 MAINTAINER <name>
RUN:在镜像中要执行的命令
格式为 RUN <command> 或 RUN ["executable", "param1", "param2"]

前者默认将在 shell 终端中运行命令,即 /bin/bash -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”,”echo hello”] 。

每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\换行。例如:
RUN apt-get update \
        && apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
        && rm -rf /var/cache/apt

WORKDIR:指定当前工作目录,相当于 cd
格式为 WORKDIR /path/to/workdir
EXPOSE:指定容器要打开的端口
格式为 EXPOSE <port> [<port>...]

注意:

该命令只是起到声明租用,并不会自动完成端口映射。
在容器启动时需要使用-P(大写P),Docker主机会自动分配一个宿主机未被使用的临时端口转发到指定的端口;使用-p(小写p),则可以具体指定哪个宿主机的本地端口映射过来。

COPY :复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的
格式为 COPY .

ADD:相当于 COPY,但是比 COPY 功能更强大

格式为 ADD <src> <dest>

该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件,复制进容器会自动解压。
可以使镜像内的绝对路径,或者相当于工作目录(WORKDIR)的相对路径。路径支持正则表达式。

检测是否成功:

docker build --no-cache -t ubunt:test

7 Docker私有仓库

7.1 私有仓库搭建和配置

  • 拉取私有仓库镜像
docker pull registry
  • 启动私有仓库容器
$ docker run -di --name registry -p 5000:5000 registry
# 172.17.0.7   http://172.17.0.7:5000
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' registry
  • 测试页面访问: http://172.17.0.7:5000/v2/_catalog, 不是私有仓库搭建成功并且内容为空
  • 修改daemon.json
vim /etc/docker/daemon.json

编辑以下内容,保存退出。

{
       "registry-mirrors": ["https://docker.mirrors.ustc.edu..cn"],
       "insecure-registries": ["172.17.0.7:5000"]
}
  • 重启docker服务
systemctl  restart docker

7.2 镜像上传至私有仓库

  • 标记镜像为私有仓库的镜像
docker tag mysql:remote_login 172.17.0.7:5000/remote_login
  • 上传标记的镜像
docker push  172.17.0.7:5000/remote_login
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值