绿色健康小清新

耐得住寂寞,守得住繁华

Docker

简介

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;

运行中的这个镜像称为容器,容器启动是非常快速的。

在这里插入图片描述

核心概念

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像;

docker镜像(Images):软件打包好的镜像;放在docker仓库中;

docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

在这里插入图片描述


安装docker

1.检查内核版本,必须是3.10及以上

1
uname -r    

2安装docker.

1
yum install docker

3.启动docker

1
2
systemctl start docker
docker -v 查看版本,检查有没有成功安装

5、开机启动docker

1
systemctl enable docker


docker常用命令&操作

1)、镜像操作

操作命令说明
检索docker search 关键字eg:docker search redis 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。
拉取docker pull镜像名:tag :tag是可选的,tag表示标签,多为软件的版本,默认是latest (可到hub去查看,eg:docker pull mysql:5.5)
列表docker images查看所有本地镜像
删除docker rmi image-id删除指定的本地镜像 (id通过docker images查看)

2)修改镜像源(一定要修改,不然慢死)

修改 /etc/docker/daemon.json ,写入如下内容(如果文件不存在请新建该文件)

# 内容:

1
2
3
4
5
6
7
8
9
vim /etc/docker/daemon.json
---------
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
-----------
sudo systemctl daemon-reload//重新加载
-----------
sudo systemctl restart docker//重启
国内镜像源地址
Docker官方中国区https://registry.docker-cn.com
网易http://hub-mirror.c.163.com
中国科技大学https://docker.mirrors.ustc.edu.cn
阿里云https://pee6w651.mirror.aliyuncs.com

(推荐:也可以在阿里云官网搜索容器镜像服务,创建一个镜像服务,从镜像加速器获取地址)

3)、容器操作

步骤(以tomcat为例:):

1.下载tomcat镜像

1
docker pull tomcat

如需选择具体版本,可以在https://hub.docker.com/搜索tomcat

1
docker pull tomcat:7.0.96-jdk8-adoptopenjdk-hotspot

2.根据镜像启动容器,不加TAG默认latest,如果没有下载latest会先去下载再启动

1
2
#错误的创建,没有端口映射,正确的在下方
docker run --name mytomcat -d tomcat:latest

–name:给容器起个名字

-d:后台启动,不加就是前端启动,然后你就只能开一个新的窗口连接,不然就望着黑乎乎的窗口,啥也干不了,Ctrl+C即可退出,当然,容器也会关闭
完整命令:
docker run -it -p 8888:8888 --name test (-v id:文件 文件) jiang/centostest (/bin/bash,dockerfile后面已有该CMD,直接进入该容器)
docker run -p 8888:8888 --name test (-v id:文件 文件) -d jaing/centostest (在后台运行,但如果前台没有一个进程会自动结束,因为-d命令会覆盖CMD)
docker run -it --name dc02 --volumes-from dc01 tulong/centos通过数据卷容器创建容器实现共享

3.查看运行中的容器

1
docker ps

4.停止运行中的容器

1
2
3
4
5
docker stop  容器的id

# 或者

docker stop 容器的名称,就是--name给起的哪个名字

5.查看所有的容器

1
docker ps -a

6.启动容器

1
docker start 容器id/名字

7.删除一个容器

1
docker rm 容器id/名字

8.启动一个做了端口映射的tomcat

1
2
3
docker run -d -p 8888:8080 tomcat
#或者
docker run -p 8888:8080--name tomcatt -d tomcat

-d:后台运行

-p: 将主机的端口映射到容器的一个端口 主机端口(8888):容器内部的端口(8080)

外界通过主机的8888端口就可以访问到tomcat,前提是8888端口开放

注意阿里云环境下需要配置(搞了我好久):

1
2
3
docker exec -it tomcat 容器id(通过docker ps查看)  /bin/bash
rmdir webapps
mv webapps.dist webapps

因为所有的文件都在webapps.dist下,而访问的是webapps下的内容

9.关闭防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看防火墙状态
service firewalld status

# 关闭防火墙
service firewalld stop

#设置防火墙对该端口不设拦截(推荐)
iptables -I INPUT -p tcp --dport 8889 -j ACCEPT
#或者
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --reload #重新加载
firewall-cmd --zone=public --query-port=22/tcp #查询是否生效
firewall-cmd --zone=public --remove-port=22/tcp --permanent #限制端口
firewall-cmd --zone=public --list-ports #查看端口

阿里云环境下还要增加一个安全组

10.查看容器的日志

1
2
docker logs 容器id/名字
docker logs -ft --tail 倒数几条 容器ID

11.可以用一个镜像启动多个容器

1
docker run -d -p 8889:8080 tomcat

12. 查看容器的内部细节

1
docker inspect 容器ID

13. 进入正在运行的容器并以命令行交互:

1
2
3
4
5
6
7
8
直接进入容器启动命令的终端,不会启动新的进程

docker attach 容器ID

是在容器中打开新的终端,并且可以启动新的进程

docker exec -it 容器ID /bin/bash

14. 退出容器

1
2
3
exit 容器停止并退出

Ctrl + P + Q 容器不停止退出

15.从容器内拷贝文件到主机上(主机到容器类似):

1
docker cp 容器ID:容器内路径 目标主机路径

16.镜像Commit

1
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

17.build镜像

1
docker build -f /mydocker/dockerfile(文件路径) -t tulong/centos (镜像名) .  (注意最后面有一个点)

18.数据卷容器

1
docker run -it --name dc02 --volumes-from dc01 tulong/centos

配置文件

1
每次修改配置文件记得重启一下容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器.
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/
可以参考每一个镜像的文档



容器数据卷

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用容器数据卷。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数卷,其特点为:

  • 数据卷可在容器之间共享或重用数据;
  • 卷中的更改可以直接生效;
  • 数据卷中的更改不会包含在镜像的更新中;
  • 数据卷的生命周期一直持续到没有容器使用它为止。

数据卷

直接命令添加

将容器与宿主机之间文件绑定:

docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash

查看数据卷是否挂在成功:

docker inspect 容器ID

容器与宿主机之间数据共享:

容器停止退出后,主机修改后数据同步。

只读权限:docker run -it -v /宿主机绝对路径目录:/容器内目录 ro 镜像名

Dockerfile添加

Dockerfile为Image的描述文件

可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷:

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] #在容器中创建这两个文件。并且当run的时候会自动在宿主机中某个路径下创建两个文件进行挂载,具体用inspect查看
CMD echo "finished,--------success1"
CMD /bin/bash

build后生成新镜像:

docker build -f /mydocker/dockerfile -t tulong/centos

run容器后自动挂载了两个目录/dataVolumeContainer1/dataVolumeContainer2

数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器.

dc02继承自dc01:

docker run -it --name dc02 --volumes-from dc01 tulong/centos

dc03继承自dc02

在dc01、dc02、dc03任意一个添加文件其它两个都会存在。

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止



DockerFile

概念

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构件步骤

  1. 编写DockerFile文件
  2. docker build 创建镜像
  3. docker run 运行镜像

CentOS6.8 的 Dockerfile:

FROM scratch 
MAINTAINER The CentOS Project <cloud-ops@centos.org>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
    vendor="CentOS" \
    license="GPLv2" \
    build-date="2016-06-02"

Default command

CMD ["/bin/bash"]

Dockerfile构建解析过程

Dockerfile文件内容:

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程:

  1. Docker从基础镜像运行一个容器;
  2. 执行一条指令并对容器作出修改;
  3. 执行类似Docker commit的操作提交一个新的镜像层;
  4. Docker再基于刚提交的镜像运行一个新容器;
  5. 执行Dockerfile中的下一条指令直到所有指令都执行完成。

Dockerfile保留字指令

FROM:基础镜像,当前镜像是基于那个镜像的;

MAINTAINER(maintainer):作者、邮箱;

RUN:容器构建时需要运行的命令;

EXPOSE:暴露端口号,启动容器的时候还需使用 –p 指定端口;

WORKDIR(workdir):指定在创建容器后,终端默认登录后进来的工作目录,一个落脚点,默认根目录,通常绝对路径,CMD ENTRYPOINT 都会在这个目录下执行;

ENV:构建镜像的过程中设置环境变量, 构建和运行时都有效可以使用$引用;

ADD:将宿主机目录下的文件拷贝到镜像且会自动处理URL和解压tar压缩包

COPY:拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/复制到新的一层镜像内<目标路径>的位置。语法:COPY src dest COPY [“src”, “desc”];

VOLUME:容器数据卷, 数据保存和持久化;

USER:指定该镜像由什么用户运行,不指定由root 运行;

CMD:指定容器启动时要运行默认的命令,Dockerfile中可以有多个cmd , 但只有最后一个生效;

ENTRYPOINT(entrypoint):指定容器启动时要运行的命令。

ONBUILD RUN 当子Dockerfile执行构建build的命令时,会触发父镜像的这个命令

案例一:封装CentOS

自定义mycentos目的使镜像具备:登陆后的默认路径、vim编辑器、查看网络配置ifconfig支持。

FROM centos
MAINTAINER zzyy<zzyy167@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo “success--------------ok”
CMD /bin/bash

案例二:自定义Tomcat

step1: 首先创建文件夹存放jdk与tomcat的安装包

mkdir -p /tulong/mydockerfile/tomcat9

step2:将jdk和tomcat安装的压缩包拷贝进上一步目录

apache-tomcat-9.0.8.tar.gzjdk-8u171-linux-x64.tar.gz

step3:在/tulong/mydockerfile/tomcat9目录下新建Dockerfile文件

FROM         centos
MAINTAINER    zzyy<zzyybs@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out 
#["catalina.sh", "run"] 可以运行一个服务,而不至于-d创建一个容器后台运行时因为没有事可做直接退出

step4:构件镜像

docker build -t mytomcat

step5:运行容器

docker run -d -p 9080:8080 --name myt9 
-v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test 
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs
--privileged=true zzyytomcat9

注:test目录中加入war包可以挂载到容器内,容器中logs文件中产生的日志可以同步到主机上。

Docker全流程示意图:

安装myqsl(5.5版本,5.7版本有问题)

安装MySQL示例

获取镜像

1
docker pull mysql:5.5

创建容器

1
docker  run -p 3306:3306 --name mysqldb -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.5

出现错误,删除该容器,并重启服务

1
systemctl restart docker

配置防火墙

1
2
iptables -I INPUT -p tcp --dport 8889 -j ACCEPT

配置阿里云安全组

其他的几个高级操作

1
2
3
4
5
6
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
指定mysql的一些配置参数

安装Redis

1
docker run -p 6379:6379 --name redis -v /root/redis/data:/data -v /root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "xxx"

安装nginx

记得挂载conf.d和nginx.conf,其中conf.d里有一个default.conf,并且还需要挂载一个存放静态资源的文件夹,不然很麻烦。

1
2
[root@iZ2ze71edtq2kxflzq2m01Z conf.d]# docker run  --name nginxtest -d -p 80:80  -v /root/nginx/conf.d:/etc/nginx/conf.d  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf  -v /root/nginx/html:/usr/share/nginx/html   nginx 

-------------本文结束感谢您的阅读-------------
六经蕴籍胸中久,一剑十年磨在手

欢迎关注我的其它发布渠道