1. docker的简介
Docker的思想来自于集装箱。在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。这样就可以不用单独使用其他的运输工具。大家都用一个标准搬运集装箱。
Docker解决的问题:
- 不同的应用程序可能会有不同的应用环境,有些软件安装之后会有端口之间的冲突,这时候,可以使用虚拟机来实现隔离,但是使用虚拟机的成本太高,而且消耗硬件。
- 不同的软件的环境都不一样,比如:你用的是乌班图,里面有个数据库,现在要迁移到centos中,但是此时需要从新在centos安装数据库,如果版本不一致,或者不支持,就会出现问题。比较麻烦。有了docker之后就不用这么麻烦了,直接将开发环境 搬运到不同的环境即可。
- 在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署可以重复利用这些内存。
总之,docker 就是用于部署项目,解决环境问题的软件技术(实现虚拟化,比传统的虚拟机技术要好),特别适合微服务。
直观的理解一下docker中的各种概念和作用。比如有一台电脑,我们很多人需要使用他,用docker可以先配制好这台电脑,比如微信都用1.10版本,浏览器都用火狐3.0版本,这样我们就有一个共同的大环境,当我需要执行业务的时候,docker会为我创建一个单独的文件夹,我的所有操作就在这个文件夹中,我可用使用电脑上的所有软件;当小明需要执行业务的时候,也可以用docker为他单独创建一个文件夹,他的所有操作都在他的文件夹中,并且我和小明使用的软件都是电脑大环境中的软件。这样既避免了使用者的冲突(我和小明不用抢着使用电脑了),又可以避免环境冲突(我们使用的都是同样的软件),还可以充分利用电脑的计算资源。
在docker中,上面说的电脑就是“虚拟机”,每个人的文件夹叫“容器”,电脑上的共享软件叫“镜像”。在第2节,我会详细列些各个组件的意义。只有理解的docker的概念和作用才能更好的学习和利用它。
2. Docker组件
2.1 Docker客户端和服务器
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护daemon进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
2.2 Docker镜像
镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:镜像可以是mysql、tomcat、redis、python等 。也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。
2.3 Registry(中央仓库)
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(ps:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
我们用docker拉取镜像都是从Registry中下载的。
2.4 Docker容器
Docker可以帮助我们构建和部署容器,只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。如下图所示。
2.5 docker调用结构
docker的整体调用逻辑如下图所示
其中,每个部分的意义如下:
-
registry:中央注册中心
-
images:就是下载镜像文件
-
client:就是操作docker的客户端(命令)
-
containter:就是docker容器 需要运行在doker服务中
官方图如下:
3. Docker安装与启动
3.1 安装环境说明
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。
由于我学习的环境都是CentOS,所以这里我们将Docker安装到CentOS7上。在安装docker前需要注意
3.2 虚拟机网络配置
要安装docker和拉取镜像,Linux系统必须能连接外部网络,建议参考B站视频,如果用视频中方法还是无法ping通外部网络,这时要考虑防火墙问题,可以执行以下命令关闭防火墙。
# 查看防火墙状态
systemctl status firewalld.service
# 关闭防火墙
systemctl stop firewalld.servic
# 永久关闭防火墙
systemctl disable firewalld.service
# 有时需要重启生效
3.3 安装Docker
使用yum命令在线安装
yum -y install docker
3.4 查看Docker版本
安装后查看Docker版本
docker -v
3.5 启动与停止Docker
systemctl命令是系统服务管理器指令,它是 service 和 chkconfig 两个命令组合。常用命令如下:
- 启动docker:
systemctl start docker
- 停止docker
systemctl stop docker
- 重启docker
systemctl restart docker
- 查看docker状态
systemctl status docker
- 开机启动
systemctl enable docker
- 查看docker概要信息
docker info
- 查看docker帮助文档
docker --help
4. Docker镜像操作
4.1 什么是Docker镜像
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
在文本文最开始也举了形象的例子,镜像就是我们需要用到的一系列程序、库、环境等。
4.2 列出镜像
列出docker下的当前docker服务所在的系统里面所有镜像:
docker images
每一列的意义:
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签,为了区分同一个仓库下的不同镜像,类似于程序的版本号,TAG使得同一个仓库中可以存储多个镜像;
- IMAGE ID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
- 这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
我们在运行同一个仓库中的不同镜像时,可以通过在仓库名后面加上一个冒号和标签名来指定该仓库中的某一具体的镜像,例如
docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash
表明从镜像Ubuntu:12.04启动一个容器,而这个镜像的操作系统就是Ubuntu:12.04。在构建容器时指定仓库的标签也是一个好习惯。
4.3 搜索镜像
如果需要从网络中查找需要的镜像,可以通过以下命令搜索:
docker search 镜像名称
例如:
每一列的意义:
- NAME:仓库名称
- DESCRIPTION:镜像描述
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
4.4 拉取镜像(下载镜像)
4.4.1 从Docker Hub拉取
Docker镜像官方地址:https://hub.docker.com/
拉取镜像命令docker pull 镜像名称:版本
,如果不加版本会自动拉取最新镜像,镜像的名称和版本号参考3.3:
# 拉取一个centos7的镜像
docker pull centos:7
注意:
由于国情的原因,国内下载 Docker Hub 官方的相关镜像比较慢,可以使用国内(docker.io)的一些镜像加速器,镜像保持和官方一致,速度块。推荐使用中科大和阿里云的镜像。
4.4.2 镜像加速
添加中科大和阿里云的Mirror地址:
步骤:
- 输入命令:
vi /etc/docker/daemon.json
,编辑该文件
PS: 如果该文件不存在就手动创建;另外有可能如果没有vim 命令则使用vi命令即可。 - 在该文件中输入如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://alzgoonw.mirror.aliyuncs.com"]
}
- 注意:一定要重启docker服务,重启命令如下,如果重启docker后无法加速,可以重新启动OS ,然后通过docker pull命令下载镜像 。
service docker restart
4.5 删除镜像
删除镜像方式1:根据仓库的名称(镜像的名称)来删除 还可以使用image_id来进行删除。
docker rmi $IMAGE_ID
删除所有镜像(一般不建议使用)
docker rmi `docker images -q`
5.Docker容器操作
5.1 查看容器
- 查看正在运行容器:
docker ps
- 查看所有的容器(启动过的历史容器)
docker ps –a
- 查看最后一次运行的容器:
docker ps -l
- 查看停止的容器
docker ps -f status=exited
5.2 创建与启动容器
创建容器命令:docker run --name 容器名称 -it -v 服务器目录:容器目录 镜像名称:镜像版本
参数说明:
-
创建容器命令:docker run
-
-i:表示运行容器
-
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-
–name :为创建的容器命名。
-
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
比如:
docker run --name szpytorch -it -v /raid/tea:/workspace/Networks pytorch:1.6.0
解释:
docker run
表示创建容器;--name szpytorch
表示容器名字为szpytorch
;-it
表示运行容器并分配给一个终端(可不理解,强行记忆);-v /raid/tea:/workspace/Networks
表示创建目录映射关系,将虚拟机的/raid/tea
目录与容器的/workspace/Networks
目录进行挂载,如果容器中没有该目录,其会自动创建;pytorch:1.6.0
表示拉取的镜像名称为pytorch
,版本号为1.6.0
5.1.1 创建交互式容器
创建一个交互式容器并取名为mycentos
docker run -it --name=mycentos centos:7 /bin/bash
开启另外一个终端来查看状态:
docker ps
退出当前容器:
exit
然后用ps -a 命令查看发现该容器也随之停止:
5.1.2 守护式容器
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器,即容器在后台运行。
命令如下(容器名称不能重复):
docker run -di --name=mycentos2 centos:7
登录守护式容器命令docker exec -it container_name (或者container_id)/bin/bash
,例如:
docker exec -it mycentos2 /bin/bash
注意:守护式进程执行exit退出时,容器不会停止。
5.3 停止与启动容器
- 停止正在运行的容器:
docker stop CONTAINER_NAME/ID
,例如
docker stop mycentos2
- 启动已运行过的容器:
docker start CONTAINER_NAME/ID
,例如:
docker start mycentos2
5.4 文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令:
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
例如:
解释:cp 当前目录下的a文件到 容器中的/usr/local/下的a文件
5.5 目录挂载(映射)
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器里所对应的目录。
创建容器 添加-v参数 宿主机目录:容器目录
例如,创建容器并挂载宿主机目录到容器中的目录下:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数–privileged=true来解决挂载的目录没有权限的问题。
docker run -di --privileged=true -v /root/test:/usr/local/test --name=mycentos4 centos:7
5.6 查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据:
docker inspect mycentos2
也可以直接执行下面的命令直接输出IP地址:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2
5.7 删除容器
- 删除指定的容器: 这个命令只能删除已经关闭的容器,不能删除正在运行的容器
docker rm CONTAINER_ID/NAME
- 删除所有的容器:
docker rm `docker ps -a -q`
或者:
[root@localhost ~]# docker rm $(docker ps -aq)
6.部署应用
6.1 MySQL部署
6.1.1 拉取MySQL镜像
docker pull mysql
查看镜像:
6.1.2 创建MySQL容器
docker run -di --name=pinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
注意:
- -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
- -e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
6.1.3 进入MySQL容器
- 进入容器中
docker exec -it pinyougou_mysql /bin/bash
- 登录mysql
mysql -u root -p
- 授权允许远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
6.1.4 远程登陆MySQL
- 我们在我们本机的电脑上去连接虚拟机Centos中的Docker容器,这里192.168.25.132是虚拟机操作系统的IP.
6.2 tomcat部署
6.2.1 拉取tomcat镜像
docker pull tomcat:7-jre8
6.2.2 创建tomcat容器
docker run -di --name=pinyougou_tomcat -p 9100:8080 tomcat:7-jre8
部署其他应用比如Redis,Nginx也类似。