什么是 Docker ?

我们可以对比 VMware 虚拟机来理解,Docker 是在虚拟机上的进一步演进。

Docker 重要的组成部分是镜像 image 和容器 container,其中镜像就相当于是虚拟机中的 .iso 镜像文件,容器相当于是同一虚拟机中安装的不同操作系统。

我们在使用虚拟机时,同一个 .iso 镜像可以创建出多个系统, docker中也是一样,一个 image 镜像可以启动多个容器。在虚拟机中,各个操作系统之间是完全独立的,docker 中也是一样,不同容器之间采用沙箱机制,相互之间完全隔离。


Docker 的安装

docker 可以在 windows 及 linux 系统下进行安装,windows 需要在专业版 10 以上的系统上才能安装,本次分享我们以 centos7 系统为例。

操作系统的内核版本要在 3.8 以上:

uname -a

关闭防火墙:

systemctl stop firewalld.service

关闭 selinux,把 selinux 设置为 disable:

vi /etc/selinux/config

安装 wget 命令:

yum install -y wget

查看所有的 docker 资源列表:

yum list | grep docker

Docker 基础详解_docker

可以通过 yum 命令直接安装:

yum install -y docker.x86_64

设置开机启动:

systemctl enable docker

更新 xfsprogs 日志系统:

yum -y update xfsprogs

启动 docker:

ps -ef | grep docker

查看 docker 版本:

docker version

Docker 基础详解_docker_02

docker 安装成功。


Docker 镜像的下载/查看及删除

搜索镜像:

docker search centos

Docker 基础详解_nginx_03

查看社区中的官方镜像:

docker search --filter "is-official=true" centos

Docker 基础详解_centos_04

下载 centos7 镜像:

docker pull centos:7

注:从国外下载会非常慢,所以要配置下阿里云镜像加速。

登陆阿里云-容器镜像服务-镜像加速器-按照提供的方法进行配置即可。

查看本地镜像:

docker images

Docker 基础详解_centos_05

删除镜像:

docker rmi imageid/centos:7


Docker 容器的构建等基本操作

构建容器并启动:

docker run -itd imageid

Docker 基础详解_centos_06

注:-i 表示以交互模式运行容器,t 表示为容器重新分配一个伪输入终端,d 启动容器。

查看当前正在运行的容器:

docker ps

查看当前的所有容器:

docker ps -a

Docker 基础详解_centos_07

停止容器:

docker stop containerid/name

启动多个容器时,全部停止:

docker stop $(docker ps -a -q)

启动容器:

docker start containerid/name

重启容器:

docker restart containerid/name

删除容器:

docker rm containerid

注:删除前,需要先停止容器。

查看容器的详细信息:

docker inspect containerid

进入容器:

docker exec -it containerid /bin/bash

Docker 基础详解_centos_08

注:进入这个容器,初始时候,相当于一个新的 linux 环境。

退出容器:

exit

注:退出后,容器仍然是运行着的。


容器的文件复制与挂载

复制文件:

docker cp /root/123.txt containerid:/home/

创建一个容器并挂载:

docker run -itd -v /root/xdclass/:/home containerid

注:-v 代表挂载

挂载和复制的区别:

挂载后宿主机和容器中的内容会同步。

挂载的应用场景:

容器中运行着一台mysql数据库服务器,一般会在宿主机中挂载一个路径给容器中的数据库运行,某一天,当前容器出现问题时,可以把这个容器删除,新建一个容器,再把宿主机中的数据库挂载进去,那么数据不会丢失。


构建自定义镜像

构建自定义镜像的意义:

下载一个centos镜像,就相当于时一个linux环境,初始时是什么都没有的,我们会在基础镜像中安装jdk tomcat等,创建容器后,一旦把这个容器删除,之前安装配置的内容就都没有了,即使通过这个镜像再启动一个容器也是没有的;所以,把这个容器打包成一个镜像,再基于这个镜像启动容器,就可以解决这个问题了。

可以把这个镜像上传到镜像仓库中,其他的服务器用的时候直接拉取来用就可以了;节省重新搭建的时间。

构建镜像有2种方法:

基于 docker commit

基于 dockerfile 制作镜像(主流)


Commit 构建自定义镜像

docker commit containerid imagename:tag

通过上面的命令,就把这个容器构建成了一个镜像,之后再通过这个镜像启动个新的容器,在最初的容器中配置的内容都还在。

具体例子:-a 提交镜像的作者,-m 提交时的说明文字。

runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
mymysql v1 37af1236adef 15 seconds ago 329 MB

Dockerfile 构建镜像

dockerfile 是一个文本文件,这个文本里面包含了构建镜像所需的命令和说明。

# this is a docerfile
FROM centos:7
MAINTAINER liping
RUN echo "正在构建镜像"
WORKDIR /home/class
COPY 123.txt /home/clas

#号:注释

FROM :定制的镜像基于哪个镜像

MAINTAINER:作者信息

WORKDIR:设置工作路径

COPY:复制文件到容器

ADD:复制文件同时解压或执行

ENV:设置环境变量

EXPOSE:设置暴露哪个端口给宿主机

RUN:执行后面的命令,作用于镜像层,镜像构建时就执行;dockerfile 中有多条时,都会执行;

ENTRYPOINT:执行后面的命令,作用于容器层,容器启动时执行;dockerfile 中有多条时,只会执行最后一条;

CMD:执行后面的命令,作用于容器层,容器启动时执行;dockerfile 中有多条时,只会执行最后一条;允许被修改;


Dockerfile 构建 java 网站镜像

我们可以先回忆下在 linux 服务器上搭建 java 网站的步骤:

上传 jdk 压缩包,解压,配置环境变量,通过 java -version 进行验证;

上传 tomcat 压缩包,解压,启动 tomcat ,访问相应的域名和端口号进行验证;

通过 docker 部署是相似的,相应的 dockerfile 如下:

FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

docker build -t mycentos:jdk .

Docker 基础详解_nginx_09

Docker 基础详解_docker_10

Docker 基础详解_nginx_11

docker run -itd -p 80:8080 mycentos:jdk /bin/bash

把容器的 8080 端口映射到宿主机的 80 端口,之后在宿主机上访问 https://localhost:80 就可以验证 tomcat 是否成功启动了。


Dockerfile 构建 nginx 镜像

我们还是先来回忆一下在 linux 服务器上构建 nginx 的步骤:

上传 nginx 压缩包,解压,通过shell命令下载依赖包,安装,进入 nginx 文件夹,启动 nginx;通过 localhost 访问 nginx 验证是否安装成功;

docker 中如果直接通过 dcokerfile 安装的话步骤会比较多,比较慢,那么我们可以先准备好一个安装 nginx 的 shell 脚本:

#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install

dockerfile :

FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80

注意,要将 shell 脚本和 dockerfile 放在同一目录下。

之后和之前一样,执行 docker build,我们会得到 nginx 镜像构建成功的结果如下:

Docker 基础详解_docker_12

启动容器中的 nginx ,注意,与tomcat一样,也要以前台的方式启动:

Docker 基础详解_nginx_13


Dockerfile 部署 mysql 数据库

拉取 mysql 的镜像:

Docker 基础详解_centos_14

拉取成功:

Docker 基础详解_centos_15

启动容器:

Docker 基础详解_docker_16

其中,MYSQL_ROOT_PASSWORD 是为 root 超级用户账户设置密码,在上面的命令中,将其密码设置为 my-secret-pw。

查看容器:

Docker 基础详解_centos_17

登陆,连接 mysql 数据库:

Docker 基础详解_centos_18

Docker 基础详解_centos_19

查看结果:

Docker 基础详解_docker_20

镜像默认是无法输入中文的;

需指定字符编码为 UTF-8:

重新创建一个 dockerfile:

init.sql 里面就是建库、建表、插入数据的 sql 语句;

ADD 后会自动执行语句;

dockerfile 写好后,执行 dockerbuild:

Docker 基础详解_nginx_21

再次连接登陆数据库,查看数据插入成功;

Docker 基础详解_centos_22

Docker 基础详解_centos_23