Docker 基础详解

落花踏尽游何处,笑入胡姬酒肆中。这篇文章主要讲述Docker 基础详解相关的知识,希望能为你提供帮助。
什么是 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??

可以通过 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 镜像的下载/查看及删除搜索镜像:
??docker search centos??

查看社区中的官方镜像:
??docker search --filter "is-official=true" centos??

下载 centos7 镜像:
??docker pull centos:7??
注:从国外下载会非常慢,所以要配置下阿里云镜像加速。
登陆阿里云-容器镜像服务-镜像加速器-按照提供的方法进行配置即可。
查看本地镜像:
??docker images??

删除镜像:
??docker rmi imageid/centos:7??


Docker 容器的构建等基本操作构建容器并启动:
??docker run -itd imageid??

注:-i 表示以交互模式运行容器,t 表示为容器重新分配一个伪输入终端,d 启动容器。
查看当前正在运行的容器:
??docker ps??
查看当前的所有容器:
??docker ps -a??

停止容器:
??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??

注:进入这个容器,初始时候,相当于一个新的 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??
通过上面的命令,就把这个容器构建成了一个镜像,之后再通过这个镜像启动个新的容器,在最初的容器中配置的内容都还在。
【Docker 基础详解】具体例子:-a 提交镜像的作者,-m 提交时的说明文字。

runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2mymysql:v1
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORYTAGIMAGE IDCREATEDSIZE
mymysqlv137af1236adef15 seconds ago329 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 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 镜像构建成功的结果如下:

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



Dockerfile 部署 mysql 数据库拉取 mysql 的镜像:

拉取成功:

启动容器:

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

登陆,连接 mysql 数据库:


查看结果:

镜像默认是无法输入中文的;
需指定字符编码为 UTF-8:
重新创建一个 dockerfile:
init.sql 里面就是建库、建表、插入数据的 sql 语句;
ADD 后会自动执行语句;
dockerfile 写好后,执行 dockerbuild:

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































    推荐阅读