一、Docker 简介:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

什么是Docker?

Docker实战(精简版本)_docker

Docker特点:

  • (1)上手快
  • (2)职责的逻辑分类
  • (3)快速高效的开发生命周期
  • (4)鼓励使用面向服务的架构

Docker组件:

Docker客户端和服务器

Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

Docker实战(精简版本)_nginx_02

二、Docker安装与启动

在VMware Workstation中安装CentOS7

使用ip addr命令查看本地IP:

 ip addr

使用yum命令在线安装Docker:

yum install docker

安装后查看Docker版本:

docker -v

启动与停止Docker

前提:docker是一个C/S架构,操作docker必须先启动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下的所有镜像:

docker images

Docker实战(精简版本)_docker_03

  • REPOSITORY:镜像所在的仓库名称
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:镜像的创建日期(不是获取该镜像的日期)
  • SIZE:镜像大小
  • 这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
  • Docker实战(精简版本)_docker_04

  • 搜索镜像:
docker search 镜像名称

Docker实战(精简版本)_docker_05

  • NAME:仓库名称
  • DESCRIPTION:镜像描述
  • STARS:用户评价,反应一个镜像的受欢迎程度
  • OFFICIAL:是否官方
  • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

使用命令拉取镜像:

docker pull centos:7

查看所有镜像:

docker images

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

​https://lug.ustc.edu.cn/wiki/mirrors/help/docker​

步骤:

  • (1)编辑该文件:vi /etc/docker/daemon.json //
    如果该文件不存在就手动创建;说明:在centos7.x下,通过vi。
  • (2)在该文件中输入如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

(3)注意:一定要重启docker服务,如果重启docker后无法加速,可以重新启动OS
然后通过docker pull命令下载镜像:速度杠杠的。

  • 删除指定镜像
docker rmi $IMAGE_ID

查看zookeeper镜像是否已经删除:

Docker实战(精简版本)_docker_06


删除所有镜像

docker rmi `docker images -q`

操作原理:先查询出所有镜像ID ,在进行删除

列出所有镜像ID

docker images -q 

四、 Docker容器操作

查看容器

查看正在运行容器:

docker ps

查看所有的容器(启动过的历史容器):

docker ps -a

查看最后一次运行的容器:

docker ps –l

查看停止的容器:

docker ps -f status=exited

创建与启动容器

创建容器常用的参数说明:

创建容器命令:

docker run
  • -i:表示运行容器
  • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
  • –name :为创建的容器命名。
  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
  • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
  • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
交互式容器

原理:创建容器并进入容器,退出容器,服务停止。
创建一个交互式容器并取名为mycentos

docker run -it --name=mycentos centos:7 /bin/bash

注:–name=mycentos指的是容器名称 centos:7 镜像名称 执行命令完成后,就已经进入centos7容器了,和宿主机centos7一样,只不过一个是宿主机,另一个是容器而已。

复制会话,这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态

执行命令:docker ps

Docker实战(精简版本)_centos_07


使用exit命令 退出当前容器

然后用ps -a 命令查看发现该容器也随之停止:

守护式容器

前提:创建容器,不进行容器,后台启动,只要不关闭容器,容器就一直处于启动状态。
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复):

docker run -di --name=mycentos1 centos:7

Docker实战(精简版本)_centos_08


查看容器是否启动:

Docker实战(精简版本)_docker_09


登录守护式容器方式:

docker exec -it container_name (或者 container_id)  /bin/bash

(exit退出时,容器不会停止)

Docker实战(精简版本)_centos_10


退出容器:

Docker实战(精简版本)_nginx_11


查看状态:

Docker实战(精简版本)_Docker_12


从图中可以看出,exit退出容器,mycentos1容器,还是可以正常处于启动状态。

停止与启动容器

停止正在运行的容器:

docker stop $CONTAINER_NAME/ID

Docker实战(精简版本)_centos_13


执行命令容器停止后,查看容器启动状态:

Docker实战(精简版本)_Docker_14


启动已运行过的容器:

docker start $CONTAINER_NAME/ID

前提:先查看那些容器启动过

查看启动过的容器:

docker ps -a 

Docker实战(精简版本)_docker_15


在执行启动以前启动过的容器命令:

docker start mycentos1

Docker实战(精简版本)_docker_16

文件拷贝

前提:容器服务必须启动才可以进行文件拷贝

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

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

案例演示:
在宿主机上创建/testfile文件:
执行命令:

echo 123 > testfile

Docker实战(精简版本)_centos_17


把宿主机testfile文件复制到mycentos1 /usr/loca目录下:

执行命令:

docker cp testfile mycentos1:/usr/local 

Docker实战(精简版本)_nginx_18


登录容器查看文件在/usr/lcoal目录下面是否存在:

登录mycentos1容器:

Docker实战(精简版本)_Docker_19


Docker实战(精简版本)_centos_20


也可以将文件从容器内拷贝出来

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

案例演示:

先把宿主机上的testfile文件删除,在从mycentos1容器中将mycentos1 /usr/lcoal 目录下面的testfile文件复制到宿主机上。

第一步:删除宿主机上的testfile文件:

Docker实战(精简版本)_centos_21


第二步:将mycentos1容器中将mycentos1 /usr/lcoal 目录下面的testfile文件复制到宿主机上。

执行命令:

docker cp mycentos1:/usr/local/testfile newTestfile
docker cp mycentos1:/usr/local/test2 /usr

格式:docker cp 容器名:目录下的文件/目录 文件名/目录名

Docker实战(精简版本)_docker_22


注:后台的文件名如果不一致,代表重命名

目录挂载

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

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7

格式1:docker run -di -v 宿主机目录:容器目录 –name=新的容器名 镜像名称:tag

格式2:docker run -di –name=新的容器名 -v 宿主机目录:容器目录 镜像名称:tag

案例演示01:

1、在宿主机/usr/local/myhtml创建目录:

Docker实战(精简版本)_Docker_23


2、创建一个新的容器与宿主机进行目录挂在,也就是目录共享,改变宿主机挂在目录下的文件,容器中的文件随之改变。

执行命令:

docker run -di --name=mycentos2 -v /usr/local/myhtml/:/usr/local/nh centos:7

格式:docker run -di --name=新的容器名 -v 宿主机目录:容器目录 镜像名称:tag

Docker实战(精简版本)_Docker_24


查看刚启动的容器:

Docker实战(精简版本)_docker_25


登录容器,查看在/usr/lcoal容器目录下面是否存在nh目录:

Docker实战(精简版本)_centos_26


在宿主机的/usr/local/myhtml目录下,添加index.html文件:

Docker实战(精简版本)_docker_27


登录容器,查看在,mycentos2容器的/usr/local/nh/目录下面是否存在index.html

Docker实战(精简版本)_centos_28


案例演示02(重点):

上传cas文件夹到宿主机挂载目录/usr/local/myhtml下面,登录容器,查看文件?

Docker实战(精简版本)_docker_29


先查看运行的容器,登录容器,查看:

Docker实战(精简版本)_docker_30


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

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

docker run -di --name=mycentos3 -v /usr/local/myhtml/:/usr/local/mh --privileged=true centos:7

Docker实战(精简版本)_docker_31


查看容器是否启动:

Docker实战(精简版本)_centos_32


登录容器,查看文件是否有权限:

Docker实战(精简版本)_nginx_33


可以正常查看文件!!!

Docker实战(精简版本)_nginx_34


4.6查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect mycentos2

Docker实战(精简版本)_nginx_35


注:此命令需要在宿主机上执行,容器内部无效。

Docker实战(精简版本)_docker_36


也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2

Docker实战(精简版本)_docker_37


4.7删除容器

删除指定的容器:

docker rm $CONTAINER_ID/NAME

Docker实战(精简版本)_Docker_38


注意,只能删除停止的容器

效果图:

Docker实战(精简版本)_nginx_39


删除所有容器:

docker rm `docker ps -a -q`

Docker实战(精简版本)_nginx_40

五、部署应用

5.1 MySQL部署
5.1.1拉取MySQL镜像

docker pull mysql

Docker实战(精简版本)_nginx_41


查看镜像

Docker实战(精简版本)_docker_42


5.1.2创建MySQL容器

docker run -di –name=pinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

Docker实战(精简版本)_Docker_43


-p 代表端口映射,格式为 宿主机映射端口:容器运行端口

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码

5.1.3进入MySQL容器,登陆MySQL

进入mysql容器

docker exec -it pinyougou_mysql /bin/bash

Docker实战(精简版本)_Docker_44


在容器中,登陆mysql

mysql -u root -p

Docker实战(精简版本)_centos_45


在容器中,退出mysql,然后从容器中退出到宿主机:

Docker实战(精简版本)_docker_46


查看,正在运行的容器:

Docker实战(精简版本)_centos_47


5.1.4远程登陆MySQL

(1)我们在我们本机的电脑上去连接虚拟机Centos中的Docker容器,这里192.168.45.13是虚拟机操作系统的IP

Docker实战(精简版本)_nginx_48


(2)在本地客户端执行建库脚本

执行“资源/建库语句/pinyougoudb.sql”

Docker实战(精简版本)_Docker_49


(1)我们在我们本机的电脑上去连接虚拟机Centos中的Docker容器,这里192.168.45.142是虚拟机操作系统的IP

Docker实战(精简版本)_centos_50

(2)在本地客户端,创建数据库病,执行建库脚本
执行“资源/建库语句/pinyougoudb.sql”

Docker实战(精简版本)_docker_51


Docker实战(精简版本)_centos_52


Docker实战(精简版本)_centos_53


Docker实战(精简版本)_docker_54


5.1.5查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect pinyougou_mysql

Docker实战(精简版本)_nginx_55


运行效果如下:

Docker实战(精简版本)_nginx_56


我们可以看到我们的数据库服务器的IP是172.17.0.3

5.2 tomcat部署

5.2.1拉取tomcat镜像

docker pull tomcat:7-jre7

5.2.2创建tomcat容器

创建容器用于部署单点登录系统(CAS) -p表示地址映射:

docker run -di --name=pinyougou_tomcat -v /usr/local/myhtml/:/usr/local/tomcat/webapps --privileged=true -p 9000:8080 tomcat:7-jre7

docker run -di --name=pinyougou_tomcat -v /usr/local/myhtml/:/usr/local/tomcat/webapps --privileged=true -p 9000:8080 tomcat:7-jre7

格式:

–privileged=true :权限赋予

9000:8080:端口映射

7-jre7 指:tag

Docker实战(精简版本)_nginx_57


查看tomcat容器启动状态:docker ps

Docker实战(精简版本)_Docker_58


浏览器验证:

​http://192.168.45.142:9000/cas/login​

Docker实战(精简版本)_docker_59

5.2.3部署web应用
(1)修改cas系统的配置文件,修改数据库连接的url

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://172.17.0.3:3306/pinyougoudb?characterEncoding=utf8"
p:user="root"
p:password="root" />

测试:地址栏输入:​​http://192.168.45.142:9000/cas/login​​ tomcat和mysql联通:

Docker实战(精简版本)_Docker_60


Docker实战(精简版本)_docker_61


5.3 Nginx部署

5.3.1拉取Nginx镜像

docker pull nginx

5.3.2创建Nginx容器

docker run -di --name=pinyougou_nginx -p 80:80 nginx/bin/bash

Docker实战(精简版本)_Docker_62


Docker实战(精简版本)_nginx_63


5.3.3测试Nginx

浏览器地址栏输入: ​​http://192.168.45.142​

Docker实战(精简版本)_nginx_64


5.3.4配置反向代

官方的nginx镜像,nginx配置文件nginx.conf 在/etc/nginx/目录下。

在容器内编辑配置文件不方便,我们可以先将配置文件从容器内拷贝到宿主机,编辑修改后再拷贝回去。

(1)从容器拷贝配置文件到宿主机

docker cp pinyougou_nginx:/etc/nginx/nginx.conf nginx.conf 

Docker实战(精简版本)_Docker_65

查看容器中是否有这个文件:

Docker实战(精简版本)_centos_66


Docker实战(精简版本)_nginx_67


(2)编辑nginx.conf,添加反向代理配置

前提:查看tomcat端口:

Docker实战(精简版本)_centos_68

upstream tomcat-cas {
server 172.17.0.4:8080;
}
server {
listen 80;
server_name passport.pinyougou.com;
location / {
proxy_pass http://tomcat-cas;
index index.html index.htm;
}
}

(3)将修改后的配置文件拷贝到容器

docker cp nginx.conf  pinyougou_nginx:/etc/nginx/nginx.conf

Docker实战(精简版本)_centos_69


(4)重新启动容器

docker restart pinyougou_nginx

Docker实战(精简版本)_centos_70


(5)设置域名指向

192.168.45.142 ​​passport.pinyougou.com​​​ 浏览器测试:http:// ​​passport.pinyougou.com/cas/login​

Docker实战(精简版本)_docker_71


5.4 Redis部署

5.4.1拉取Redis镜像

docker pull redis

5.4.2创建Redis容器

docker run -di --name=pinyougou_redis -p 6379:6379 redis

5.4.3客户端测试
在你的本地电脑命令提示符下,用window版本redis测试

redis-cli -h 192.168.247.135

六、备份与迁移

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

docker commit pinyougou_nginx mynginx
  • pinyougou_nginx是容器名称
  • mynginx是新的镜像名称

此镜像的内容就是你当前容器的内容,接下来你可以用此镜像再次运行新的容器
6.2镜像备份

docker  save -o mynginx.tar mynginx

-o 输出到的文件
执行后,运行ls命令即可看到打成的tar包
6.3镜像恢复与迁移
首先我们先删除掉mynginx镜像
然后执行此命令进行恢复

docker load -i mynginx.tar

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