python学习之容器化管理docker

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的容器就像操做一个快速轻量级的虚拟机同样简单。html

为何选择Docker?
上手快
用户只须要几分钟,就能够把本身的程序"Docker化"。Docker依赖于"写时复制"(copy-on-
write)模型,使修改应用程序也很是迅速,能够说达到"为所欲为,代码即改"的境界。随后,就能够建立容器来运行应用程序了。大多数Docker容器只须要不到1秒便可启动。由
于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也能够运行更
多的容器,使用户尽量的充分利用系统资源。
在linux程序中,fork()会产生一个和父进程彻底相同的子进程,但子进程在此后多会
exec系统调用,出于效率考虑,linux中引入了“写时复制”技术,也就是只有进程空间的
各段的内容要发生变化时,才将父进程的内容复制一份给子进程。python

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

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

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

1.3 容器与虚拟化的比较
下面的图片比较了Docker和传统的虚拟化方式的不一样之处,可见容器在操做系统层面上实现虚拟化,直
接复用本地主机的操做系统,而传统的虚拟化则是在硬件层面实现。
总结: 与传统的虚拟机相比,Docker的优点体现为启动速度快、占用体积小。知乎上看到一个更加形象的例子:
python学习之容器化管理docker
python学习之容器化管理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会在镜像的最上一
层建立一个可写层,镜像自己是只读的,保持不变。web

1.4.3 Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。
公有仓库 :全部人能够访问下载镜像的仓库。Docker公司运营公共的Registry叫作Docker Hub。
私有仓库: 规定范围内能够访使用的库。用户能够构建私有的Registry。
2 Docker的安装与启动
2.1 安装Dockerredis

首先得安装一下docker的环境,针对你的系统看一下docker的官网 吧, 下面是Linux系统的安装步
骤。
方法一: 直接使用docker光放镜像源安装docker最新版本
(1) yum包更新到最新sql

阿里安装软件镜像源下载

$ 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 -vdocker

方法二: 官网下载软件包, 自行安装
$ yum install * -y
$ docker version
python学习之容器化管理docker数据库

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
python学习之容器化管理docker
#从tar包载入镜像
#从镜像仓库拉取镜像
#查看镜像
REPOSITORY: 镜像名称
TAG: 镜像标签
IMAGE ID: 镜像ID
CREATED: 镜像建立的时间(不是获取该镜像的日期)
SIZE: 镜像大小
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。

3.1.2 搜索镜像

若是你须要从网络中查找须要的镜像,能够经过下面命令搜索:
$ docker search 镜像名称3.1.3 拉取镜像
python学习之容器化管理docker
拉取仓库就是从镜像仓库中下载镜像到本地。
$ docker pull 镜像名称
python学习之容器化管理docker

3.1.4 删除镜像

按ID删除镜像
$ docker rmi 镜像ID
删除全部镜像(注意:`是反向单引号)<br/>$ docker rmidocker images -q`
python学习之容器化管理docker

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 , 访问效果以下:
python学习之容器化管理docker

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 tagmysql:remote_login 172.17.0.7:5000/remote_login上传标记的镜像$ docker push 172.17.0.7:5000/remote_login

相关文章
相关标签/搜索