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容器拥有很高的性能,同时同一台宿主机中也可以运行更

多的容器,使用户尽可能的充分利用系统资源。

在linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会

exec系统调用,出于效率考虑,linux中引入了“写时复制”技术,也就是只有进程空间的

各段的内容要发生变化时,才将父进程的内容复制一份给子进程。

职责的逻辑分类

使用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

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

骤。

方法一: 直接使用docker光放镜像源安装docker最新版本

(1) yum包更新到最新

阿里安装软件镜像源下载

$ wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

$ yum makecache # 生成缓存

$ yum update # yum包更新

(2) 配置yum仓库安装Docker$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-

ce.repo

(3) 安装Docker

$ yum install docker-ce -y

(4) 安装后查看Docker版本

$ docker -v

方法二: 官网下载软件包, 自行安装

$ yum install * -y

$ docker version

2.2 设置ustc的镜像

ustc说老牌的linux镜像服务提供者,ustc的docker镜像加速器速度很快。ustc docker mirror的优势之

一就是不需要注册,是真正的公共服务。

https://lug.ustc.edu.cn/wiki/

编辑该文件:

$ vim /etc/docker/daemon.json

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

{

"registry-mirrors": ["https://docker.mirrors.ustc.edu..cn"],

}

2.3 Docker的启动与停止

systemctl命令是系统服务管理器指令。

启动Docker:

$ systemctl start

docker停止Docker:

$ systemctl start

docker

重启Docker:

$ systemctl restart

docker

查看Docker状态:

$ systemctl

status docker

开机启动Docker:

$ systemctl

enable docker

查看Docker概要信息:

$ docker info

查看Docker帮助文档:

$ docker --help

3 常用命令

3.1 镜像相关命令

3.1.1 查看镜像

$ docker load -i game2048.tar

$ docker pull

tensorflow/tensorflow

$ docker images

#从tar包载入镜像

#从镜像仓库拉取镜像

#查看镜像

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 rmidocker 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

(2) 守护方式创建容器

$ docker run -di --name=容器名称 镜像名称:标签 # 创建容器

$ docker exec -it 容器名称/容器ID # 登录守护容器交互环境的方式

/bin/bash

创建容器, exit退出当前容器

查看容器

$ docker ps -a

加载镜像

$ 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 load -i game2048.tar

$ docker run -d --name 2048 -p 127.0.0.1:8888:80 game2048

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

3.2.3 停止与启动容器

停止容器:

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

启动容器:

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

3.2.4 文件拷贝

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

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

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

$ 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

#创建用户lvah,允许任意主机(%)远程登陆,登陆密码为123.

mysql> create user lvah@'%' identified by '123';

#授权lvah@%用户, 允许操作任意数据库和任意数据表(.).

mysql> grant all privileges on . to 'lvah'@'%';

#修改账户密码加密规则并更新用户密码。

mysql> alter 'lvah'@'%' identified with mysql_native_password by '123';

#重新加载用户授权表。

mysql> flush privileges;

mysql> ^DBye

root@664bda0fe52a:/# exit

远程登录MySQL

$ mysql -ulvah -p123 -h172.17.0.2

报错处理:

报错显示:

用户在连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be

loaded的错误。

[root@foundation0 ~]# mysql -ulvah -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';

4.2 Tomcat部署

拉取镜像

$ docker search tomcat

$ docker pull

创建Nginx容器

tomcat$ docker run -di --name tomcat -p 8081:8080 -v

/usr/local/webapps:/usr/local/tomcat/webapps tomcat

$ docker inspect --format='{{.NetworkSettings.IPAddress}}' tomcat

$ ls /usr/local/webapps/

测试页面访问

4.3 Nginx部署

拉取镜像

$ docker search nginx

$ docker pull

nginx

$ netstat -antlpe | grep 80

创建Nginx容器

$ docker run -di --name=nginx -p 81:80 nginx

#端口映射

$ docker inspect --format='{{.NetworkSettings.IPAddress}}' nginx

172.17.0.4

$ docker exec -it nginx /bin/bash

测试页面访问

4.4 Redis部署

拉取镜像

$ docker search redis

$ docker pull

redis

$ docker images

创建Redis容器

$ docker run -di --name=redis -p 6380:6379 redis

$ docker inspect --format='{{.NetworkSettings.IPAddress}}' redis

客户端测试

#$ redis-cli -h 172.17.0.5

2.17.0.5:6379> ping

PONG

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文件构建一个新的镜像开始工

作了。

对于运维人员: 在部署时,可以实现应用的无缝移植。

6.2 常用命令

命令 作用

FROM Image_name:tag 定义了使用哪个基础镜像启动构建流程

MAINTAINER user_name 声明镜像的创建者

RUN command 执行命令,是Dockerfile的核心部分(可以写多条)

COPY source_dir/file dest_dir/file 和ADD类似, 如果是压缩文件,不会自动解压

ENV key value 设定环境变量

WORKDIR path_dir 设置工作目录

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

python容器开发_python学习之容器化管理docker相关推荐

  1. 有哪些免费自学python的网站_Python学习网站有哪些?Python基础教程网站推荐

    Python学习网站有哪些?Python基础教程网站推荐:菜鸟教程.PHP中文网.PHP中文网.W3C.Reddit.博学谷.python中文学习大本营.Python 3 Module of the ...

  2. 使用Python实现基于强化学习与游戏化学习典型算法

    作者:禅与计算机程序设计艺术 随着现代社会和互联网的快速发展,基于网络.移动终端等新型信息技术的应用也越来越多,为人类提供了无限可能.同时,由于计算机科学和互联网技术的飞速发展,计算机已逐渐成为人类社 ...

  3. python 题库系统,Python可以开发Web程序,也可以管理操作系统。

    Python可以开发Web程序,也可以管理操作系统. 更多相关问题 请论述什么是正常?什么是异常? 哪些用地需要招标.拍卖或者挂牌出让国有建设用地使用权? 如何防止给水管道振动? 下列哪些事件的发生会 ...

  4. 高中生学python培养思维能力_python学习(七周七第二章结构化思维及如何学习)...

    20180908星期六 总结中,为没有华丽的语句感到烦恼.是因为自己忘记初衷,如果是学习就记录今天学习内容.感想.问题:如果是工作就记录今天最优成就的一件事.今天遇见的问题:如果是生活就记录今天最开心 ...

  5. 自学python如何就业_python学习:想要自学Python达到就业的水平,应该怎么去学习...

    点击蓝字"python教程"关注我们哟! 这篇文章主要给大家讲解学习Python技术应该如何学习才能达到企业要求 内容会涉及到Python的学习技巧以及系统的学习知识安排和学习方法 ...

  6. python窗体开发_python开发窗体

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 虽然使用标准库tkinter开发python gui程序很方便,也提供了强大的功 ...

  7. Python后端开发岗学习路线是什么

    前言 Python web开发工程师 2022年7月平均薪资超过21000元.并且是招聘量十分巨大的岗位,即使是二线城市,岗位需求也非常高. (文末送读者福利) 今天给大家分享一位前辈整理的一个Pyt ...

  8. 自学python困难吗_Python学习难不难?零基础好学吗?

    Python学习难不难?零基础好学吗?我想对于很多人来说,这都是非常关键的问题,也是很多人都在疑惑的问题.现在市场发展,行业的竞争压力是非常大的,转型的人也是非常多,对于不少人转型人才来说,Pytho ...

  9. 测试学python路线_小蜗分享:Python测试开发全套学习路线

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第一阶段:专业基础课程 阶段目标: 1. 熟练掌握IT核心技术:编程,数据库,操作系统,版本控制 2. 能够熟练运用所学技术搭建各类服务器环境 3. 深入 ...

最新文章

  1. 深入理解PHP原理之变量分离/引用(Variables Separation)
  2. Linux下多路复用IO接口epoll/select/poll的区别
  3. Noip2016换教室
  4. C++ 高级篇(三)—— 出错处理
  5. [delphi]修改indy源码后重新编译
  6. html5中如何自动跳转页面,实现HTML5上滑跳转页面的两种方法
  7. mysql 读取data文件_利用mysql的LOAD DATA INFILE的功能读取客户端文件
  8. django-celery beat报错 error pid
  9. 近世代数——Part2 群:基础与子群 课后习题
  10. JQ 吸顶导航-Demo
  11. oracle cube语法,oracle Rollup 和 Cube用法
  12. 教务系统漏洞再生南工大FaceMash
  13. 论文,污水流量检测系统
  14. python怎么交换xy轴_在python中,将x轴交换为y轴
  15. Quantile-Quantile (q-q) Plots
  16. SSM | Spring
  17. 个人总结:Mysql知识图谱
  18. 1.Spring入门
  19. 打听别人工资的7个话题,让你薪水更高
  20. 苹果cms手机模板好看的简洁手机端模板免费下载

热门文章

  1. Johnson–Lindenstrauss Lemma(2)attention
  2. ERP实施手记 生不如死的二次开发
  3. vue-echarts组件
  4. 绩效改进——BEM模型
  5. 活动招募丨HUAWEI HiAI 能力开放公开课
  6. 毕设word排版:页眉:宋体五号,居中排列。左面页眉为论文题目,右面页眉为章次和章标题。页眉底划线的宽度为0.75磅。 页码:宋体小五号,排在页眉行的最外侧,不加任何修饰
  7. c#提前感知,看完保证自己再看书不晕车 简单不能再见的基础。
  8. VS2017制作POV-LED取模软件 可对图片取模
  9. c4d渲染测试软件,C4D中阿诺德GPU渲染测试
  10. 转一个有意思的利用存储过程备份恢复PostgreSQL