什么是Docker?
官网:https://www.docker.com/html
开源:https://github.com/dockermysql
Docker是一个开源的应用容器引擎,支持将软件编译成一个镜像,而后在镜像中各类作好配置,将镜像发布出去,其它使用者直接使用这个镜像。容器启动是很是讯速的。相似windows里面的ghost操做系统,安装好后什么都有了。linux
Docker核心概念
Docker核心概念:nginx
- docker主机(Host):一个物理或虚拟的机器用于执行Docker守护进程和容器(安装了Docker程序的机器,能够是Linux或windows)
- docker客户端(Client):客户端经过命令或其它工具使用Docker API()与Docker的守护进程通讯
- docker仓库(Registry):用来保存打包好的镜像,能够理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com)提供了庞大的镜像集合供使用。
- docker镜像(Images):用于建立Docker容器的模板
- docker容器(Container):镜像启动后的实例称为一个容器;容器是一个独立运行的一个或一组应用
Docker使用步骤:git
1)安装Dockergithub
2)去Docker仓库找到这个软件对应的镜像redis
3)使用Docker运行这个镜像,这个镜像就会生成一个Docker容器sql
4)对容器的启动中止就是对软件的启动中止docker
安装Docker(Linux)
1)环境:CentOS七、shell
Docker要求CentOS内核版本高于3.10,若是版本太低,能够用yum update
升级内核版本
2)安装
yum update #更新内核到3.10以上 yum install docker systemctl start docker #启动docker systemctl enable/disable docker #设为/关闭开机启动 systemctl stop docker #中止docker
启动失败
解决办法:vim /etc/sysconfig/docker
,设置--selinux-enabled=false
参考了:https://blog.csdn.net/kavito/article/details/81200665
总结:将centos7的内核升级至最新后再安装docker能够减小不少错误,另外还须要禁用sell linux。
[root@eureka1 test]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
安装Docker(Windows)
Docker Desktop requires Windows 10 Pro or Enterprise version 14393 to run.
经常使用操做
1、镜像操做
操做 | 命令 | 说明 |
---|---|---|
检索 | docker search xxx,如:docker search redis | 检索镜像,做用不大,还不如到官网上检索 https://hub.docker.com/ |
拉取 | docker pull 镜像名:tag | :tag是可选的,tag表示标签,多为软件版本,默认为latest |
列表 | docker images | 查看全部本地镜像 |
删除 | docker rmi image-id | 删除指定的本地镜像 |
清理镜像 | docker image prune | 清除一些遗留的临时镜像,释放空间 |
- | docker commit -m="提交的描述信息" -a="做者" 容器ID 要建立的目标镜像名:[TAG] | 提交容器副本使之成为一个新的镜像 |
示例:
搜索镜像
[root@localhost test]# docker search mysql INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/mysql MySQL is a widely used, open-source relati... 8345 [OK] docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 2860 [OK] docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 623 [OK] docker.io docker.io/percona Percona Server is a fork of the MySQL rela... 438 [OK] docker.io docker.io/centurylink/mysql Image containing mysql. Optimized to be li... 60 [OK] docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQL database server 57 docker.io docker.io/mysql/mysql-cluster Experimental MySQL Cluster Docker images. ... 45
下载镜像
[root@localhost test]# docker pull mysql:5.5 ...
怎么知道有哪些可用的tag?官网上搜索会提示有哪些可用的tags https://hub.docker.com/
解决镜像下载慢的问题:
1)登陆阿里云 https://www.aliyun.com/ ,查看镜像加速地址,如:https://chohcg90.mirror.aliyuncs.com
2)vim /etc/docker/daemon.json
,修改以下:
{ "registry-mirrors": ["https://chohcg90.mirror.aliyuncs.com"] }
参考:https://www.cnblogs.com/kevin7234/p/10617734.html
将镜像提交到阿里云
1)登陆阿里云,建立镜像仓库
2)本地上传镜像到刚刚建立的镜像仓库
建立镜像仓库后,上面有文档参考
2、容器操做
软件镜像(QQ安装程序)---》运行镜像---》产生一个容器(正在运行的QQ)
操做 | 命令 | 说明 |
---|---|---|
运行 | docker run --name container-name -d image-name <br> 如:docker run -name myredis -d redis | --name:自定义容器名 <br> -d:后台运行 <br> image-name:指定镜像模板 |
列表 | docker ps(查看运行中的容器) | docker ps -a 能够查看全部容器 |
中止 | docker stop/kill container-name/container-id | 中止当前运行的容器 |
启动 | docker start/restart container-name/container-id | 启动容器 |
删除 | docker rm container-id <br> docker rm -f $(docker ps -q) 删除所有在运行的容器 <br> docker rm -f $(docker ps -a -q) 删除全部容器 | 删除指定的容器 |
端口映射 | -p 6379:6379 <br> 如:docker run -d -p 6379:6379 --name myredis redis | -p:主机端口(映射到)容器内部的端口 |
容器日志 | docker logs container-name/container-id [OPTIONS] | -t 加入时间戳 <br> -f 跟随最新的日志打印 <br> --tail x(x是数字) 显示最后多少行 |
查看容器内运行的进程 | docker top 容器id | |
查看容器内部细节 | docker inspect 容器id | 查看容器的内部细节,包括IP、网桥 |
进入正在运行的容器 <br> 并以命令行交互 | docker exec -it 容器ID bashShell <br> docker container exec -it nginx1 /bin/bash <br> docker attach 容器ID |
区别:<br> attach 直接以命令交互方式进入容器 <br> exec 不用进入容器却能执行容器的命令 |
从容器拷贝文件到主机上 | docker cp 容器ID:容器内路径 目标主机路径 | |
更多命令 |
容器启动命令 docker run,格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS,有些是一个减号,有些是两个减号
-
--name = "给容器起个名字"
-
-d 后台运行,并返回容器ID
-
-i 以交互模式运行容器,一般与 -t 同时使用
-
-t 为容器从新分配一个伪输入终端,一般与 -i 同时使用
-
-P 随机端口映射
-
-p 指定端口映射
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort,这个经常使用
- containerPort
例如在docker上启动ctntos
docker run -it 9f38484d220f
退出centos
- exit,彻底退出并关闭容器
- 快捷键:ctrl + P + Q,暂时退出但不关闭容器
从新进入centos
- 方式一:
docker exec -t 容器ID /bin/bash
- 方式二:
docker attach 容器ID
docker exec -t 容器ID ls -l /tmp
能够直接执行容器中的命令而不用进入容器中的命令行界面,“隔山打牛”。
docker ps [OPTIONS]
- -a 全部历史记录的容器
- -l 上一次打开的容器
- -n x(x是数字),最近打开过的x个容器
- -q 查出正在运行的容器ID,批量删除容器:docker rm -f $(docker ps -q) ——20190704
文件拷贝
- 从宿主机拷贝文件到容器中:docker cp 须要拷贝的文件或目录 容器名称:容器目录
- 从容器拷贝文件到宿主机中:docker cp 容器名称:容器目录 宿主机目录
目录挂载
-v 参数
目录挂载是为了方便在宿主机编辑文件,而后会同步到容器上,程序运行,最终是按容器中的目录
镜像原理
这是金鱼背上的一个集装箱
相关概念:
- UnionFS(联合文件系统)
- bootfs,
- rootfs,在bootfs之上,包含的就是典型的Linux中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各类不一样的操做系统发行版本,如ubuntu、centos。
数据卷
数据卷:对容器数据的持久化,持久化到主机上,容器与主机之间的数据共享。
-v 参数
命令:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名或id
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名或id
- 默认是可读可写
- :ro 只读,容器只能读,主机可读可写
总结:-v
除了目录映射外,还能够文件映射,即:-v /宿主机绝对路径文件:/容器内的文件,如nginx.conf ——20191121
DockerFile
1)在主机根目录下新建mydocker目录并进入
# cd / # mkdir /mydocker # cd /mydocker/
2)在Dockerfile中使用 VOLUME 指令来给镜像添加一个或多个数据卷
# vim DockerFile
内容以下:
FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,-----------success1" CMD /bin/bash
3)build生成新的镜像
# docker build -f /mydocker/DockerFile -t zzyy/centos .
4)运行刚刚生成的容器容器
# docker run -it zzyy/centos
在根目录下能够看到多个两个卷
5)备注
若是出现容器卷不能写,出现cannot open directory:Permission denied
解决办法:在挂载目录后多加一个 --privileged=true 参数
容器数据卷
是什么
命名的容器挂载数据卷,其它容器经过容器经过挂载这个(父容器)实现数据共享,挂载数据卷的容器称之为数据卷容器。
一句话:活动硬盘上挂活动硬盘,实现数据的传递依赖。
数据共享
上面已经建立了一个 zzyy/centos 镜像,而且有了两个数据卷 dataVolumeContainer一、dataVolumeContainer2
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zzyy/centos latest e8c61129663a 9 hours ago 202 MB ... [root@localhost ~]# docker run -it --name dc01 zzyy/centos [root@3da5bea8d5d8 /]# ll total 12 -rw-r--r--. 1 root root 12082 Mar 5 17:36 anaconda-post.log lrwxrwxrwx. 1 root root 7 Mar 5 17:34 bin -> usr/bin drwxr-xr-x. 2 root root 6 Jul 4 16:19 dataVolumeContainer1 drwxr-xr-x. 2 root root 6 Jul 4 16:19 dataVolumeContainer2 drwxr-xr-x. 5 root root 360 Jul 4 16:19 dev drwxr-xr-x. 1 root root 66 Jul 4 16:19 etc ... [root@3da5bea8d5d8 /]# cd dataVolumeContainer2/ // 在这个容器的这个目录,建立一个文件 [root@3da5bea8d5d8 dataVolumeContainer2]# touch dc01_add.txt ctrl + p + q [root@localhost ~]# docker run -it --name dc02 --volumes-from dc01 zzyy/centos [root@61be3fe9262b /]# ll total 12 -rw-r--r--. 1 root root 12082 Mar 5 17:36 anaconda-post.log lrwxrwxrwx. 1 root root 7 Mar 5 17:34 bin -> usr/bin drwxr-xr-x. 2 root root 6 Jul 4 16:19 dataVolumeContainer1 drwxr-xr-x. 2 root root 26 Jul 4 16:20 dataVolumeContainer2 drwxr-xr-x. 5 root root 360 Jul 4 16:28 dev ... [root@61be3fe9262b /]# cd dataVolumeContainer2 [root@61be3fe9262b dataVolumeContainer2]# ll total 0 -rw-r--r--. 1 root root 0 Jul 4 16:20 dc01_add.txt // 这个文件是从 dc01容器继承过来的 [root@61be3fe9262b dataVolumeContainer2]# [root@61be3fe9262b dataVolumeContainer2]# touch dc02_add.txt ctrl + p + q [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 61be3fe9262b zzyy/centos "/bin/sh -c /bin/bash" 11 minutes ago Up 11 minutes dc02 3da5bea8d5d8 zzyy/centos "/bin/sh -c /bin/bash" 19 minutes ago Up 19 minutes dc01 [root@localhost ~]# docker run -it --name dc03 --volumes-from dc01 zzyy/centos [root@d541e9e3b6a2 /]# cd dataVolumeContainer2 [root@d541e9e3b6a2 dataVolumeContainer2]# ll total 0 -rw-r--r--. 1 root root 0 Jul 4 16:20 dc01_add.txt -rw-r--r--. 1 root root 0 Jul 4 16:38 dc02_add.txt // 也有前两个容器的文件 [root@d541e9e3b6a2 dataVolumeContainer2]# [root@d541e9e3b6a2 dataVolumeContainer2]# touch dc03_add.txt ctrl + p + q [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d541e9e3b6a2 zzyy/centos "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes dc03 61be3fe9262b zzyy/centos "/bin/sh -c /bin/bash" 19 minutes ago Up 19 minutes dc02 3da5bea8d5d8 zzyy/centos "/bin/sh -c /bin/bash" 28 minutes ago Up 28 minutes dc01 [root@localhost ~]# docker attach dc01 [root@3da5bea8d5d8 dataVolumeContainer2]# ll total 0 -rw-r--r--. 1 root root 0 Jul 4 16:20 dc01_add.txt -rw-r--r--. 1 root root 0 Jul 4 16:38 dc02_add.txt -rw-r--r--. 1 root root 0 Jul 4 16:47 dc03_add.txt // dc01容器有子容器添加的文件 [root@3da5bea8d5d8 dataVolumeContainer2]#
整理:dc0二、dc03的父类都是dc01,子到父,父到子均可以传递文件。
若是此时将父容器dc01删掉,dc02和dc03之间数据仍是共享的,也就是文件是共享的,数据卷的生命周期一直持续到没有容器使用它为止。
DockerFile
是什么
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令、参数构成的脚本。
三个步骤
1)编写DockerFile文件
2)docker build
3)docker run
文件长什么样子的?以centos6.8为例
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内容基础知识:
- 每条保留字指令都必须为大写字母且后面跟随至少一个参数
- 指令按照从上到下顺序执行
- #表示注解
- 每条指令都会建立一个新的镜像层,并对镜像进行提交
执行大体流程
- 从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行 docker commit 提交一个新的镜像层
- 基于刚刚提交的镜像运行一个新的容器
- 执行下一条指令直至全部指令都执行完成
体系结构(保留字指令)
- FROM
- MAINTAINER
- RUN
- EXPOSE
- WORKDIR
- ENV
- ADD
- COPY
- VOLUME
- CMD
- ENTRYPOINT
- ONBUILD
解释
- FROM,基础镜像,当前镜像是基于哪一个镜像的
- MAINTAINER,镜像维护者的姓名、邮箱
- RUN,容器构建时须要执行的命令
- EXPOSE,当前容器对外暴露的端口
- WORKDIR,指定在容器建立后,终端默认登陆进来的工做目录,落脚点
- ENV,用来在构建镜像过程当中设置环境变量,定义变量后,后面的指令就可使用$来获取定义的变量
ENV MY_PATH /usr/mytest ... WORKDIR $MY_PATH
- ADD,将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY,相似ADD,只是拷贝,从<源路径>拷贝到<目标路径>
- COPY src dest
- COPY ["src","dest"]
- VOLUME,容器数据卷,用于数据保存、待久化,VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
- CMD,指定一个容器启动时运行的命令,能够有多个CMD命令,但只有最后一个生效,CMD会被 docker run 以后的参数替换
- ENTRYPOINT,指定一个容器启动时运行的命令,跟CMD同样,都是在指定容器启动程序及参数,区别是:CMD命令可能被替换,而ENTRYPOINT能够追加命令
- ONBUILD,在构建一个被继承的DockerFile时运行命令,父镜像在被子继承后交镜像的onbuild被触发
案例
自定义mycentos
让精简版的centos具备如下功能:
- 登陆后的默认路径
- vim编辑器
- 支持ifconfig查看网络
步骤:
1)在宿主机根目录下的mydocker目录下建立一个DockerFile
cd / cd /mydocker vim DockerFile2
内容以下:
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
2)构建
docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .
注意:最后有个点.
表明当前路径
3)运行
docker run -it mycentos:1.3
默认进入 /usr/local 目录,也能使用 vim/ifconfig 命令了
4)列出镜像变动历史
docker history 镜像ID docker history 8911244c3084
FAQ
Docker容器开机自动启动
在使用docker run启动容器时,使用--restart参数来设置:
# docker run -m 512m --memory-swap 1G -it -p 58080:8080 --restart=always --name bvrfis --volumes-from logdata mytomcat:4.0 /root/run.sh
--restart具体参数值详细信息:
- no - 容器退出时,不重启容器;
- on-failure - 只有在非0状态退出时才重新启动容器;
- always - 不管退出状态是如何,都重启容器;
参考:https://blog.csdn.net/menghuanbeike/article/details/79261828