Docker 基础详解
Posted 清晨lip
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
通过上面的命令,就把这个容器构建成了一个镜像,之后再通过这个镜像启动个新的容器,在最初的容器中配置的内容都还在。
具体例子:-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 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:
再次连接登陆数据库,查看数据插入成功;
以上是关于Docker 基础详解的主要内容,如果未能解决你的问题,请参考以下文章