Docker:CentOS7中安装与使用Docker

Docker的安装与启动

Docker可以运行在MAC、Windows、CentOS、DEBIAN、UBUNTU等操作系统上,提供社区版和企业版 。

  • 安装在windows系统时,要求windows系统是win10专业版;
  • 安装在Linux系统中时,要求Linux是64位的。如果使用CentOS系统,建议使用CentOS7(因为Docker对CentOS7的支持不太好)

下面,在CentOS7.6-64Bit系统下安装Docker。

(这里用的腾讯云服务器!)

目标:在线安装docker,并使用命令启动、停止docker

实现步骤

  1. 修改yum源为ustc; 使用其他厂商的镜像服务器也可以,常用的如Aliyun
  2. 安装docker;
  3. 修改docker的镜像源为ustc;
  4. 使用docker命令操作docker

这是在线安装,需要联网才行,而且网速要好(下载速度不低于1M/s)。

安装Docker

以下在root用户下执行。

# 1、yum 包更新到最新
yum update

# 2、作用:安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依
赖的
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3、 设置yum源(以下2选1即可)
# 3.1、方案一:使用ustc的(推荐)		这个网站的连接不需要
yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 3.2、方案二:使用阿里云(可能失败)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4、 安装docker;出现输入的界面都按 y
yum install -y docker-ce

# 5、 查看docker版本
docker -v

设置镜像源

ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。

国内比较好用的几个镜像源 :

Docker 官方中国区:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中国科技大学:https://docker.mirrors.ustc.edu.cn
阿里云:https://y0qd3iq.mirror.aliyuncs.com

需要给Linux系统添加一个配置文件:/etc/docker/daemon.json

# 新建目录及文件
$ mkdir /etc/docker # 创建目录
$ vim /etc/docker/daemon.json # 创建docker的配置文件
# 如果系统刚安装时,没有vim工具,可以使用vi指令。或者安装vim
$ sudo yum install vim

# 在daemon.json文件中添加如下内容
{ 
	"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

# 重启docker服务(docker内运行的所有容器都会停止,这就相当于windwos系统重启,应用程序都会被关闭。)
$ sudo systemctl restart docker

# 验证镜像源配置是否成功
$ docker info|grep Mirrors -A 1	# 会看到配置镜像源信息

如果使用ustc镜像源下载镜像比较慢的话,可以考虑换成阿里云的。

Docker的启动与停止

# 启动docker服务:
systemctl start docker

# 启动docker服务(docker的守护进程)后,运行docker的hello-world程序,来验证是否成功安装并启动
docker run hello-world

# 停止docker服务:
systemctl stop docker

# 重启docker服务:
systemctl restart docker

# 查看docker服务状态:
systemctl status docker

# 设置开机启动docker服务:
systemctl enable docker

1. Docker常用命令

这是docker本身的指令,跟Linux系统的版本就没有关系了!

  • **从这开始,均使用的是guest用户进行的操作。 $符号开关,表示当前用户是非root用户。

先修改一下/etc/sudoers文件的配置内容,给guset赋予能够执行一切指令的权限:

Docker:CentOS7中安装与使用Docker_第1张图片

1.1 一些通用命令

# 获取有关Docker版本的信息
$ docker -v

# 获取所有可用Docker命令的列表
$ docker

1.2 镜像相关命令

查看镜像

# 查看当前系统可用的镜像
$ docker images

搜索镜像 + 拉取镜像

# 在线搜索镜像
$ docker search 镜像名称
$ docker search centos

# 拉取镜像
# 就是从Docker仓库下载镜像到本地,镜像名称格式为 “名称:版本号”,如果版本号不指定则是最新的版本
$ docker pull centos:7

删除镜像

要求所删除的镜像不能被任何的容器正在使用,否则需要先删除容器,再删除镜像。

# 查看当前宿主机可用的镜像
$ sudo docker images	# 普通用户只用docker images指令是没权限查看镜像列表的

# 删除镜像
$ sudo docker rmi centos	# 使用名称删除镜像
$ sudo docker rmi 镜像id	   # 按照镜像id删除镜像

# 删除所有镜像
$ sudo docker rmi `docker images -q`	# 反单引

1.3 容器相关命令

容器,也是docker中的核心概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。 (镜像是类,容器就是对象)

Docker提供的关于容器的操作有:

  • 查看容器
  • 创建容器
  • 启动容器
  • 停止容器
  • 文件拷贝
  • 目录挂载
  • 查看容器ip地址
  • 删除容器

查看容器

# 查看正在运行过的容器
$ sudo docker ps
#查看所有容器
$ sudo docker ps -a

创建容器

可以基于已有的镜像来创建和启动容器,创建与启动容器使用命令:

语法格式:$ sudo docker run [参数列表] 使用的镜像名称或ID /bin/bash

参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

交互式容器

什么是交互式容器?启动容器之后会直接进入容器的命令行终端,如果退出容器,则容器停止运行。

命令行终端进入容器中时,使用exit命令退出容器。

# 先查询当前主机中可用的镜像
$ sudo docker images

# 拉取一个镜像;这一步不是每次启动容器都要做的,如果主机中已有此镜像,就无需再拉取了
$ sudo docker pull centos

# 创建并启动名称为 mycentos7_inter 的交互式容器;下面指令中的镜像名称 centos 也可以使用镜像id
# /bin/bash  表示进入容器后,shell脚本(指令)使用的解析器
$ sudo docker run -it --name=mycentos7_inter centos /bin/bash

参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

创建容器成功后就直接进入了容器,Linux指令中显示的用户标识也跟着变了

[root@030d34106602 /]# 一进入容器,默认是拥有的root用户权限

想要退出当前容器,执行exit指令。

是否创建成功,可以通过$ docker ps$ docker ps -a查看容器。

守护式容器

对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。(docker本身就有一个守护进程,也就是可以在后台运行的进程,它的作用就是保持docker程序处于运行之中。)

命令如下(同一主机中的容器间名称不能重复):

# 创建并启动守护式容器
$ sudo docker run -di --name=mycentos7_daemon centos

# 登录进入容器,命令为:(exit退出时,守护式容器不会停止)
$ sudo docker exec -it container_name (或者 container_id) /bin/bash
$ sudo docker exec -it mycentos7_daemon /bin/bash

参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

-d:分离模式,在后台运行命令。在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。

然后登录进容器

再使用exit指令退出守护式容器,再用docker ps查看正在运行的容器,可以看到上面启动的守护式容器,还在运行中。

那么问题来了? 我要怎么退出一个守护式容器呢??–>看下面“停止容器”

停止与启动容器

要回到宿主机中来执行docker命令(容器中是没有安装docker的)

# 停止正在运行的容器:docker stop 容器名称或者ID
$ sudo docker stop mycentos7_daemon

# 停止守护式容器后,再查看正在运行的容器中,看看守护式容器有没有被停止
$ sudo docker ps

# 启动已运行过的容器(QQQQ: 没有运行的过的容器,能否用这种方式启动?):docker start 容器名称或者ID
$ sudo docker start mycentos7_daemon

文件拷贝

  • 将linux宿主机中的文件拷贝到容器中

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

# 在主机根目录下,创建一个文件abc.txt
$ sudo touch a.txt

# 在主机目录下,执行指令。
# 复制a.txt到 mycentos7_daemon 容器的 / 目录下		要保证容器已启动
$ sudo docker cp a.txt mycentos7_daemon:/

# 进入 mycentos7_daemon 容器
$ sudo docker exec -it mycentos7_daemon /bin/bash

# 查看容器 / 目录下文件
$ sudo ll

参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

  • 将文件从容器内拷贝出来到linux宿主机中
    语法:docker cp 容器名称:容器目录 需要拷贝的文件或目录
# 进入容器后,如果没有什么文件,就创建一个,如文件c.txt
$ sudo touch c.txt

# 退出容器
$ sudo exit

# 在Linux宿主机器执行复制
# 将容器 mycentos7_daemon 中根目录/下的c.txt文件复制到Linux宿主机器的/root目录下
$ sudo docker cp mycentos7_daemon:/c.txt /root

注意:容器在停止状态下,也可以完成文件的拷贝。

目录挂载

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

创建容器时添加-v参数,后边为宿主机目录:容器目录

例如: sudo docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7

QQQQ:如果我现在已有容器了,想要来建立一个挂载目录,怎么办呢?

创建容器时,建立挂载目录:

# 创建linux宿主机器要挂载的目录
$ sudo mkdir /usr/local/test

# 创建并启动容器 mycentos3,并挂载linux中的/usr/local/test目录到容器的/usr/local/test目录
# 后面,在linux中的/usr/local/test中操作,相当于对容器相应目录操作
# 创建一个守护式容器
$ sudo docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7

# 在linux宿主机下,创建文件
$ sudo touch /usr/local/test/def.txt

# 进入容器
$ sudo docker exec -it mycentos3 /bin/bash

# 在容器中,查看目录中是否有对应文件def.txt
$ sudo ll /usr/local/test

参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。

另外,还要注意:

如果你共享的是多级目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。

查看容器ip

语法:docker inspect 容器名称(容器ID)

# 在linux宿主机下查看容器的ip
$ sudo docker inspect mycentos7_daemon

注意:

容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的物理机笔记本是不能与容器直接通信的,如果需要则要通过宿主机器端口的代理。

删除容器

分为删除指定容器,与删除所有容器

语法:

​ 删除指定窗口:docker rm 容器名称(容器ID)

# 删除指定容器
$ sudo docker rm mycentos_daemon

# 删除所有容器
$ sudo docker rm `docker ps -a -q`	# 反单引

如果容器是运行状态,则会删除失败,需要停止容器才能删除。

2. Docker容器部署应用

在Docker容器中部署应用程序,就相当于是安装软件。

以安装如下应用程序为例:

  • MySQL
  • Tomcat
  • Redis
  • Nginx

2.1 MySQL容器部署

查看与搜索镜像

查看一下当前Linux主机中有哪些镜像及容器:

# 查看镜像
$ sudo docker images

# 查看容器
$ sudo docker ps -a  # 查看全部容器

# 搜索一下mysql有哪些镜像
$ sudo docker search mysql

拉取镜像

# Linux宿主机中操作:拉取MySQL的镜像,如果有了就不需要再拉取了
$ sudo docker pull centos/mysql-57-centos7

创建容器

# Linux宿主机中操作:使用镜像创建mysql守护式容器,并进行端口映射,同时配置环境变量
$ sudo docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

参数说明:

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,就是创建交互式容器了。)。

-i:表示运行容器

–name :为创建的容器命名。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 容器中的MySQL的root用户密码,作为root用户远程登陆之用

操作容器中的MySQL

# 登录进容器
$ sudo docker exec -it mysql /bin/bash

# 登录容器里面的mysql,登录后,默认使用的是容器的root用户
mysql -u root -p		# 在容器中使用root用户登录的话,不需要输入密码,密码写为空

参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

远程登录MySQL

# 查看ip
# 如果要内部连接该mysql(指当前Linux宿主机内),比如其他容器要连接mysql容器的mysql的时候,可以使用如下命令查看Ip
$ sudo docker inspect mysql

使用Navicat在windows中进行远程登录,连接在docker容器中的MySQL数据库。

docker容器中的MySQL数据库的参数:

​ 主机名或地址:虚拟机IP

​ 端口:3306

​ 用户名:root

​ 密码:root


使用最新版本的MySQL时,Navicat连接Docker -Mysql会报错:caching sha_2_password cannot be load。

原因

​ docker上pull的mysql为最新的,最新的MySQL更换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password) 。

解决方案

​ 登录进入mysql容器,执行以下mysql指令,然后再用Navicate连接。

alter user 'root'@'%' identified with mysql_native_password by 'root';

地址映射关系图示

Docker:CentOS7中安装与使用Docker_第2张图片

2.2 Tomcat容器部署

安装并启动tomcat容器

# 查询
$ sudo docker search tomcat

# 拉取镜像
$ sudo docker pull tomcat:7

# 创建并启动tomcat容器,并挂载webapps目录
# 要确保虚拟机存在/usr/local/tomcat/webapps目录,没有的话要先创建好
$ sudo docker run -di --name=tomcat7 -p 8080:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7

# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
#执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件后面添加如下配置:打开IPv4 forwarding
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network

参数说明:

-i:表示运行容器

–name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,这样就可以在宿主机上做修改,然后直接共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

测试tomcat安装成功与否

​ 本地主机通过浏览器访问虚拟机的8080端口,我的地址为:http://192.168.178.147:8080

​ 此时,会显示连接不上,HTTP ERROR 404错误,说明是资源找不到。这是正确的,并不是说tomcat没有安装没有启动。

原因:

​ 宿主机/usr/local/tomcat/webapps下没有任何资源,故而对应映射到Tomcat容器的webapps目录中也没有任何项目资源,所以访问不到。

# 进入容器tomcat中去查看
# 进入的默认目录就是 `root@c632fdf96976:/usr/local/tomcat#`
$ sudo docker exec -it mytomcat7 /bin/bash

# 查看容器tomcat的webapps目录,可见它是空目录,没有任何资源

可以往tomcat的/user/local/tomcat/webapps下部署应用,然后再访问。

比如,往tomcat容器中部署dubbo-admin.war包的项目

​ dubbo-admin默认的账号密码:guest/guest

Docker:CentOS7中安装与使用Docker_第3张图片



2.3 Redis容器部署

安装并运行Redis容器

# 查询redis镜像
$ sudo docker search redis

# 拉取redis镜像,如果有3.2版本及以上,最好安装它们(redis的geo功能,要求它是3.2及其以上版本)
$ sudo docker pull redis:3.2

# 创建并启动redis容器
$ sudo docker run -di --name=redis3.2 -p 6379:6379 redis

# 进入redis容器
$ sudo docker exec -it redis3.2 /bin/bash	# 默认进入到‘root@5a543e59cf93:/data#’

# 容器中启动redis客户端,进行数据操作
$ sudo cd /usr/local		# 进入redis安装目录
$ sudo cd /usr/local/bin	# 进入redis安装程序的bin目录
$ sudo ./redis-cli			# 启动redis客户端

Docker:CentOS7中安装与使用Docker_第4张图片

远程连接Redis

使用Redis Desktop Manager管理工具连接

Docker:CentOS7中安装与使用Docker_第5张图片

2.4 Zookeeper容器部署

# 查询镜像
$ sudo docker search zookeeper

# 拉取镜像
$ sudo docker pull zookeeper

# 创建并启动 zookeeper 容器
$ sudo docker run -di --name=zookeeper -p 2181:2181 zookeeper

# 查看是否成功启动
$ sudo docker ps # 查看正在运行的容器

2.5 Nginx容器部署

# 查询镜像
$ sudo docker search nginx

# 拉取镜像
$ sudo docker pull nginx

# 创建并启动 nginx 容器
$ sudo docker run -di --name=nginx -p 80:80 nginx

# 本地主机访问Nginx容器		http://宿主虚拟机IP/
192.168.178.151	# 80端口可以不写

3. Docker Compose

Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

它是一个定义和运行多容器的 docker应用工具。

使用compose,通过配置docker-compose.yml文件同时启动多个容器。

Docker-Compose将所管理的容器分为三层,分别是:

  • 工程(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。即是 Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所 有容器管理与部署操作。
  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名 字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose 所完成的任务。
  • 容器(container):镜像的运行实例

一个工程当中可包含多个服务;每个服务中定义了容器运行的镜像,参数,容器间依赖关系,一个服务当中可包括多个容器实例。

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工 程,若无特殊指定工程名即为当前目录名。

Docker-Compose工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE-f参数自定义配 置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

还使用一个Dockerfile模板文件,让用户很方便地定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

3.1 docker-compose的安装与卸载

要求是64-bit Linux,而且还要求其他一些库的支持。

Docker:CentOS7中安装与使用Docker_第6张图片

安装

Compose目前已经完全支持Linux、Mac OS和Windows。安装Compose之前,需要先安装Docker。

下面我们将compose安装到CentOS7.6-64bit系统中:

(二进制包方式安装的,卸载时,删除二进制文件即可)

# 安装 py-pip
# 检查linux中有没有安装py-pip包,终端执行 pip -V
$ sudo pip -v
# 若没有安装,则进行安装
$ sudo yum -y install epel-release
$ sudo yum -y install python-pip
$ sudo pip install --upgrade pip	# 升级到最新版本

# 安装docker-compose
$ sudo pip install docker-compose --ignore-installed requests
# curl是通过url语法命令在线上传或下载文件的工具
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose	# 设置文件的可执行权限 +x

# 查看版本信息
$ sudo docker-compose -version

1568310052418

卸载

# 二进制包方式安装的,删除二进制文件即可
$ sudo rm -rf /usr/local/bin/docker-compose

3.2 docker-compose常用命令

  • 查询命令帮助信息:docker-compose [command] --help

Compose命令的基本的使用格式为:

docker-compose [-f ...] [options] [COMMAND] [ARGS...]

-f,–file FILE		指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,–-project-name NAME		指定项目名称,默认将使用所在目录名称作为项目名。
--verbose			输出更多调试信息
-v,–-version		打印版本并退出
Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

3.3 docker-compose模板文件

模板文件配置是使用Docker Compose的核心,涉及的指令关键字也比较多。

默认的模板文件名称为docker-compose.yml,格式为YAML格式。

比如一个Compose模板文件:

version:"3"	# 指定模板文件版本,也就是指定了应用版本
services:
  nginx1:	# 定义一个服务,取名为 nginx1
    images: nginx	# 使用nginx镜像来创建容器
    ports:
      - "80:80"	# 端口映射,宿主机端口:容器端口
    volumes:
      - /usr/local/abc:/usr/local/abc	# 数据卷,即目录挂载

# volumes:

# networks:

docker-compose.yml模板文件主要分为3个区域,如下:

  • services 服务

在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网 络、依赖哪些其他服务等等。 一个服务中可以有多个容器

  • volumes 数据卷

在它下面可以定义数据卷(名字等等),然后挂载到不同的服务下去使用。

  • networks 应用的网络

在它下面可以定义应用的名字、使用的网络类型等等。 这个“应用”,就是一个具体的web应用,相当于docker中的project。

docker-compose.yml文件使用的主要命令

指令 功能
build 指定服务镜像Dockerfile所在路径
cap_add, cap_drop 指定容器的内核能力(capacity)分配
command 覆盖容器启动后默认执行的命令
cgroup_parent 指定父cgroup组,意味着将基础该组的资源限制
container_name 指定容器名称。默认将会使用项目名称服务名称序号这样的格式
devices 指定设置映射关系
dns 自定义DNS服务器。可以是一个值,也可以是一个列表
dns_search 配置DNS搜索域。可以是一个值,也可以是一个列表
dockerfile 指定额外编译镜像的Dockerfile文件,可以通过该指令来指定
env_file 从文件中获取环境变量,可以为单独的文件路径或列表
environment 设置环境变量,可以使用数组或字典两种格式
expose 暴露端口
external_links 链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器
extra_hosts 指定额外的host名称映射信息
image 指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜像
labels 指定服务镜像Dockerfile所在路径
links 链接到其他服务中的容器
log_driver 指定日志驱动类型,类似于Docker中的–log-driver参数。目前支持三种日志驱动类型: log_driver:“json-file”、log_driver:“syslog”、log_driver:“none”
log_opt 日志驱动的相关参数
net 设置网络模式。参数类似于docker clinet的–net参数一样
pid 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以 通过进程ID来相互访问和操作
ports 暴露端口信息
security_opt 指定容器模板标签(label)机制的默认属性(如用户、角色、类型、级别等)
ulimits 指定容器的ulimits限制值
volumes 数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式 (HOST:CONTAINER:ro)

3.4 Compose应用

  • 需要root用户去编写

需求:编写docker-compose.yml模版文件,实现同时启动tomcat、mysql和redis容器。

创建docker-compose.yml文件

# 创建文件夹
$ sudo mkdir -p /usr/local/docker-compose
#进入文件夹
$ cd /usr/local/docker-compose
#创建 docker-compose.yml文件;内容如下
$ sudo vi docker-compose.yml

建议使用EditPlus去编写Linux的配置文件。

编写docker-compose.yml文件

  • 注意,写到配置文件中时,所有注释都给去掉
version: '3'
# 服务配置
services:
  redis1: # 服务名
    image: redis:3.2	# 使用redis镜像创建容器
    ports:
      - "6379:6379"	# 端口映射,宿主机端口:容器端口
    container_name: "redis1"	# 创建的容器名称
    networks:	# 定义容器所处的网络
      - dev
  mysql1:
    image: mysql	# 镜像未加版本号,就是使用的最新版本
    environment:
      MYSQL_ROOT_PASSWORD: "root"
    ports: 
      - "3306:3306"
    container_name: "mysql1"
    networks: 
      - dev
  tomcat:
    images: tomcat:7
    ports: 
      - "8080:8080"
    container_name: "tomcat1"
    networks: 
      - dev
      - pro
  nginx1:
    image: nginx
    ports:
      - "80:80"
    container_name: "nginx1"
    networks: 
      - pro
      
# 网络配置
networks:
  dev:	# 开发环境
    driver: bridge
  pro:	# 生产环境
    driver: bridge

以上配置文件中,各容器所有网络的情况:

Docker:CentOS7中安装与使用Docker_第7张图片

运行docker-compose.yml文件,启动项目

#启动前最好把docker重启,不然原来的tomcat/mysql/redis容器也是启动状态的话,那么会因端口冲突而启动失败
$ sudo systemctl restart docker
$ cd /usr/local/docker-compose
$ sudo docker-compose up

# 如果想后台启动,则使用如下命令
$sudo docker-compose up -d

# 若要停止
$sudo docker-compose stop

查看运行情况:

Docker:CentOS7中安装与使用Docker_第8张图片


Docker:CentOS7中安装与使用Docker_第9张图片


Docker:CentOS7中安装与使用Docker_第10张图片


测试

Docker:CentOS7中安装与使用Docker_第11张图片

4. 容器|镜像的迁移与备份

Docker:CentOS7中安装与使用Docker_第12张图片

QQQQ:如何在centos容器中安装tomcat等应用程序??

​ centos容器中,就得以原生方式安装应用(上传应用安装包,安装)。

涉及到的命令有:

docker commit 将容器保存为镜像

docker save 将镜像备份为tar文件

docker load 根据tar文件恢复镜像

# 将容器保存为镜像
$ sudo docker commit 容器名称 镜像名称

# 备份镜像为tar文件
$sudo docker save -o 文件名.tar|文件名.tar.gz 镜像名	# 保存到当前目录下

# 从tar文件中恢复镜像
$sudo docker load -i 文件名.tar

注意:同一个主机中,不能有两个同名的镜像

5. Dockerfile

什么是Dockerfile

使用Docker时,想要获得一个镜像,可以从Docker仓库中进行下载,或者使用镜像备份后的tar文件。还可以自己根据需求制作新的镜像。

Dockerfile就是用于制作新镜像的。

Dockerfile其实是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的内容来构建新镜像。

Dockerfile文件内容一般分为4部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行的指令

Dockerfile常用命令

Docker:CentOS7中安装与使用Docker_第13张图片

使用Dockerfile制作新镜像

基于基础镜像制作新镜像,新镜像中会包含有其他一些应用,如jdk,tomcat等。

示例

以镜像 centos:7为基础镜像,添加jdk1.8的应用,构建一个包含jdk1.8的centos7新镜像,取名为 jdk1.8-centos7

这个取名是有讲究的:

​ (取名规则,借鉴Java中类的命名,前面是修饰,最后才是类的根本,如 MessageListener

​ 分段命名,中划线分隔。

​ 比如上面这个“jdk1.8-centos7”: 其根本上是一个centos7系统,但是这个系统有包含有jdk1.8。


注意:要添加到基础镜像中的jdk1.8应用,是一个jdk1.8的tar包,不是一个jdk1.8容器或镜像。


# 1、宿主机中创建目录
$ sudo mkdir -p /usr/local/jdk1.8-centos7
$ cd /usr/local/jdk1.8-centos7

# 2、上传 jdk-8u221-linux-x64.tar.gz 文件到宿主机的/usr/local/jdk1.8-centos7目录
# jdk安装包注意一定要是linux 64位的,oracle官方上下载即可

# 3、在 /usr/local/jdk1.8-centos7 目录下创建Dockerfile文件
$ sudo vim Dockerfile

# Dockerfile文件内容如下:(环境变量中各个属性的值,得根据自己用的jdk安装包版本来写)
FROM centos:7
MAINTAINER yeats
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

# 4、执行命令构建镜像;不要忘了后面的那个 .
$ sudo docker build -t='jdk1.8-centos7' .	# 最后那个点,表示“当前目录”,即将构建的新镜像存放到当前目录

# 5、查看镜像是否建立完成
$ sudo docker images

(1)ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/

将jdk安装到/usr/local下没什么说的,Linux中建议用户安装的软件都放到该目录下。但安装到java目录下,这是windows中jdk默认安装的目录C:\Program Files\Java\jdk1.8.0_144

(2)ENV JAVA_HOME /usr/local/java/jdk1.8.0_221

怎么知道jdk压缩包解压后的目录是jdk1.8.0_221的?去解压一下看看就可以了

1568364881016

(3)WORKDIR /usr

WORKDIR 工作目录。 指一进入容器,默认进入到的目录。

执行构建命令,会根据Dokcerfile文件的内容,一行一行执行(一行命令就是一个执行步骤):

  • 注意,下面图中原来使用的jdk压缩包是linux-32bit的,制作新镜像,创建容器都能成功,但是最后进入jdk1.8-centos7容器中查看jdk版本时,java -version命令是执行不了的,会报错。

Docker:CentOS7中安装与使用Docker_第14张图片


使用新镜像创建容器,并测试

使用上面制作的新镜像jdk1.8-centos7,创建容器

基础镜像是centos:7,创建出来的容器,严格意义上讲,它是centos容器,但这是个安装了jdk1.8的centos容器。

# 查询宿主机现有镜像
$ sudo docker images

# 使用新镜像jdk1.8-centos7,创建守护式容器
$ sudo docker run -di --name=jdk1.8-centos7 jdk1.8-centos7

# 查看正在运行的容器,是否有jdk1.8-centos7
$ sudo docker ps

# 启动并进入容器
$ sudo docker exec -it jdk1.8-centos7 /bin/bash
# 一进入到容器,就会进入到其“工作目录”,即Dockerfile文件中配置的“WORKDIR”值

# 在jdk1.8-centos7容器中查询jdk版本号
$ java -version

Docker:CentOS7中安装与使用Docker_第15张图片



QQQQ:Dockerfile文件如何编写,去为centos基础镜像中添加更多的应用程序呢?

6. Docker私有镜像仓库

Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,总之,你想建立一个私有镜像仓库,那么我们就可以来搭建自己的私有仓库,用于存储和管理自己经常使用的镜像。

6.1 私有镜像仓库的搭建

私有镜像仓库,本质上也是一个Docker容器,Docker官方为此提供了一个仓库镜像:registry。因此,要使用私有镜像仓库,首先就是去获取这个仓库镜像,并使用它建立一个镜像仓库容器

# 1、拉取私有仓库镜像
docker pull registry

# 2、启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://宿主机ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库
搭建成功
# 4、修改daemon.json
vi /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将宿主机ip修改为自己宿主
机真实ip
{"insecure-registries":["宿主机ip:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registr

Docker:CentOS7中安装与使用Docker_第16张图片


6.2 上传镜像到私有仓库

# 0、查看当前宿主机的镜像
$ sudo docker images

# 1、标记某个镜像为私有仓库的镜像
# 例如:将自己创建的 jdk1.8-centos7 标记为私有仓库镜像
$ sudo docker tag jdk1.8-centos7 宿主机IP:5000/jdk1.8-centos7
$ sudo docker tag jdk1.8-centos7 192.168.178.151:5000/jdk1.8-centos7

# 2、再次启动私有仓库容器
docker restart registry

# 3、上传标记的镜像
docker push 宿主机IP:5000/jdk1.8

# 4、输入网址查看仓库效果
`http://192.168.178.151:5000/v2/_catalog`

1568368723452



Docker:CentOS7中安装与使用Docker_第17张图片

6.3 从私有仓库拉取镜像

分为两种情况:

  • 从本地私有镜像仓库拉取镜像

    也就是从自己主机上配置的私有镜像仓库中拉取镜像

    ----实践中,这种情况不多。通常是自己个人的需要,制作了新的镜像留存再用。

  • 从其他服务器上的私有镜像仓库拉取镜像

    ----实践中,这是更常见的。比如从公司的私服上拉取镜像到自己的电脑上来用。

从本地私有镜像仓库拉取镜像

直接执行如下命令:

# 私有仓库所在的服务器上如果已经存在相关镜像,要先删除(指定镜像名删除,不是指定id)。而且该镜像不能已经被其他容器所关联(有存在的容器是使用该镜像创建的容器)
$ sudo docker rmi 服务器ip:5000/jdk1.8-centos7

#拉取镜像
$ sudo docker pull 服务器ip:5000/jdk1.8-centos7

#可以通过如下命令查看 docker 的信息;了解到私有仓库地址
$ sudo docker info

从其他服务器上的私有镜像仓库拉取镜像

大多数情况下,都是在一台A服务器部上署了私有镜像仓库之后,其它服务器从A服务器上的私有镜像仓库中拉取镜像。

若要拉取私有仓库镜像,需要去修改本机docker的配置文件,设置启动时候的仓库地址。

这里所说的docker配置文件在哪里?

/usr/lib/systemd/system/docker.service文件,这是Docker的安装文件

# 打开docker配置文件(建议使用EditPlus去编辑Linux的配置文件)
vi /usr/lib/systemd/system/docker.service	# 使用命令去编辑,需要在root用户权限下

# 按下图,去添加如下的内容(注意修改下面内容中的ip地址为自己当前所用的宿主机IP)
--add-registry=192.168.178.151:5000 --insecure-registry=192.168.178.151:5000 \	# 最后反斜杠莫丢


# 修改完后需要重新加载docker配置文件并重启docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Docker:CentOS7中安装与使用Docker_第18张图片

反斜杠表示,内容都是属于ExecStart,但是换一行显示。

然后,就可以直接从其他服务器上的私有镜像仓库拉取镜像,像从本地私有仓库或公有镜像仓库去拉取镜像一样。

# 拉取镜像		
$ sudo docker pull jdk1.8-centos7	# 不需要再写成`docker pull IP:端口/jdk1.8-centos7`

# 查看镜像
$ sudo docker images

附录:Docker运行图

Docker:CentOS7中安装与使用Docker_第19张图片

你可能感兴趣的:(Docker)