docker安装与使用
一,容器概念
容器三大基本概念 镜像 image 容器 container 仓库 repository
docker整个生命周期就是这三个概念。
docker镜像
image相当于一个root文件系统,比如官方镜像 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。
image的分层存储
因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。
docker容器
image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。 容器可以被创建、启动、停止、删除、暂停
docker仓库
镜像构建完成后,可以很容易的在宿主机上运行,如果要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务。docker registry就是这样的服务。
一个docker registry可以包含多个仓库(repository),每个仓库有多个tag(标签),每个标签对应一个镜像。
一个仓库包含同一个软件不同版本的镜像,标签就是用于标记版本的。
如
ubantu:14.04
ubantu:16.05
不指定tag的话默认是
ubantu:latest
仓库名海会以 bob/nginx-proxy形式出现,表明docker registry多用户环境下的 用户名/软件名
docker Registry
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。
除此以外,还有 CoreOS 的 Quay.io,CoreOS 相 关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像 使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。
国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。
使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后 面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓 库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。
二,安装
官方教程如下,最正确安装docker姿势
1.卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.设置存储库 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安装docker社区版 sudo yum install docker-ce 4.启动关闭docker systemctl start docker
5. 查看版本
docker version
#yum安装软件的整个过程 1.配置yum源,在/etc/yum.repos.d/下产生 docker.repo文件 2.检查这个文件中的baseurl地址,下载的软件包就来自于这里 3.baseurl=https://download.docker.com/linux/centos/7/$basearch/stable 4.查看yum到底安装的是谁 docker-ce-18.09.0-3.el7.x86_64.rpm 2018-11-07 23:58:48 18.7 docker-ce-cli-18.09.0-3.el7.x86_64.rpm 5.yum自动下载rpm包,自动解决依赖关系,非常方便 6.通过yum下载的软件包,systemctl进行管理 7. systemctl start docker 8.docker version查看版本 假如你配置yum官方仓库无法安装,由于网络因素,那你就别配yum官方仓库了,删掉仓库 通过自带的epel源下载 yum install docker ,只是这个版本较低,
docker版本
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。
企业版包含了一些收费服务,个人开发者一般用不到。本文的介绍都针对社区版。
系统环境准备
docker最低支持centos7且在64位平台上,内核版本在3.10以上
[root@oldboy_python ~ 10:48:11]#uname -r
3.10.0-693.el7.x86_64
Docker镜像加速器
https://www.daocloud.io/mirror#accelerator-doc https://www.cnblogs.com/pyyu/p/6925606.html #一条命令加速 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io # 或者也可以手动 vim /etc/docker/daemo.json 写入 {"registry-mirrors": ["http://95822026.m.daocloud.io"]}
三,使用
1,基本命令
启动docker
systemctl start/restart/stop docker
基本命令
1.docker加速器,加速镜像下载 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io 2.获取docker镜像 docker search ubuntu #查找ubuntu镜像 docker pull ubuntu #下载ubuntu镜像 3.查看docker存在哪些镜像 docker image ls docker images 4.删除镜像文件 1.删除容器相关记录 docker rm 容器id 2.删除镜像记录 docker rmi 镜像名(镜像id) 3.批量删除容器记录 docker rm `docker ps -aq` 5.检查容器进程(存活) docker ps 6.检查容器进程记录(挂掉的) docker ps -a 7. 运行镜像,产生容器 docker run hello-world 8.交互式运行docker容器 docker run -it --rm ubuntu bash docker run就是运行容器的命令。 参数 -it : -i 是交互式操作,-t是终端 -rm : 容器退出后将其删除。也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间。 ubuntu:14.04 这指的是镜像文件 bash : 指定用交互式的shell,因此需要bash命令
后台模式启动docker
-d参数:后台运行容器,返回容器ID
# docker在centos中运行一段shell脚本,后台运行
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done" # 返回结果
c0283f1077d16a2bf2597e269d51a02815334f7390f18a62ed7a4ba07f351b65 #检查容器进程docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0283f1077d1 centos "/bin/sh -c 'while..." 6 seconds ago Up 5 seconds fervent_turing
查看容器内的标准输出
docker logs c02
停止容器
docker stop c02
#此时容器进程不存在
docker ps
启动容器
docker start c02
#检查容器进程
docker ps
删除容器 docker rm c02
2,提交创建自定义的镜像(docker container commit)
1.我们进入交互式的centos容器中,发现没有vim命令 docker run -it centos 2.在当前容器中,安装一个vim yum install -y vim 3.安装好vim之后,exit退出容器 exit 4.查看刚才安装好vim的容器记录 docker container ls -a 5.提交这个容器,创建新的image docker commit 059fdea031ba sss/centos-vim 6.查看镜像文件 [root@master /home]docker images REPOSITORY TAG IMAGE ID CREATED SIZE sss/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
3,搭建简单web应用,外部访问容器
容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。
-P 参数会随机映射端口到容器开放的网络端口
#docker run -d -P training/webapp python app.py
检查映射的端口
#宿主机ip:32768 映射容器的5000端口
[root@oldboy_python ~ 16:34:02]#docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi
查看容器日志信息
#不间断显示log
docker logs -f cfd
也可以通过-p参数指定映射端口:常用
#指定服务器的9000端口,映射到容器内的5000端口
[root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e
访问服务器的9000端口
(如果访问失败的话,检查自己的防火墙,以及云服务器的安全组)

查看指定容器的端口映射
#docker port c0b 5000/tcp -> 0.0.0.0:9000
查看容器内的进程
#docker top c0b UID PID PPID C STIME TTY TIME CMD root 3926 3912 0 16:46 ? 00:00:00 python app.py
四,发布docker image到仓库
1,docker hub公有镜像发布
1.docker提供了一个类似于github的仓库dockerhub, 网址https://hub.docker.com/需要注册使用 2.注册docker id后,在linux中登录dockerhub docker login
注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag ubuntu mrglh/ubuntu
语法是: docker tag 仓库名 mrglh/仓库名
3.推送docker image到dockerhub docker push mrglh/ubuntu
4.在dockerhub中检查镜像 https://hub.docker.com/
5.删除本地镜像,测试下载pull 镜像文件 docker pull mrglh/ubuntu
2,私有仓库
但是这种镜像仓库是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry官方提供的私有仓库
docker私有仓库搭建: docker -v 参数 假设我要在docker容器中安装 nginx 软件 nginx软件有网页根目录 root /opt/static/nginx js css 这个nginx静态文件,可以放在容器中管理 也可以通过-v参数挂载一个数据 -v 宿主机/opt/staic/nginx 容器/opt/static/nginx js1 js2 js3 容器中的nginx软件,读取数据时候,通过-v参数,去宿主机读取
步骤详解
1.找到本地docker文件 vim /etc/docker/daemon.json 2.写入配置 必须注意此文件是json格式!!!注意引号 {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["45.32.52.244:5000"] } 3.将此文件,添加到docker服务脚本中 vim /lib/systemd/system/docker.service 4.写入以下配置,注意!!!,写入到[Service]配置块中,加载此配置文件 [Service] EnvironmentFile=/etc/docker/daemon.json 5.修改了docker配置文件,重新加载docker systemctl daemon-reload 6.重启docker服务,使得生效 systemctl restart docker 7.由于重启了docker,所有的容器实例全挂了,因此要打开私有仓库的容器实例 1.docker ps -a 检查私有仓库的容器记录 2. docker start 私有仓库的id 3.此时docker ps 检查 私有仓库服务是否启动 8.修改本地镜像的tag,便于推送到本地镜像仓库 docker tag 镜像名 45.32.52.244:5000/镜像名 如 docker tag ubuntu 45.32.52.244:5000/ubuntu 9.推送本地镜像到私有docker仓库 docker push 45.32.52.244:5000/ubuntu 10.docker私有仓库提供了API数据可供查看 http://10.0.0.10:5000/v2/_catalog 11.可以测试删除本地镜像,然后从私有仓库拖取镜像 docker pull 45.32.52.244:5000/ubuntu
五,利用dockerfile定制镜像
镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。
- 镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image FROM centos #使用base image FROM ubuntu:14.04 #带有tag的base image LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释 LABEL maintainer=“yc_uuu@163.com" #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令! RUN yum update && yum install -y vim \ Python-dev #反斜线换行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME” WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd WORKDIR /test #如果没有就自动创建 WORKDIR demo #再进入demo文件夹 RUN pwd #打印结果应该是/test/demo ADD and COPY ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录 ADD test.tar.gz / #添加到根目录并解压 WORKDIR /root ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径 COPY hello test/ #等同于上述ADD效果 ADD与COPY - 优先使用COPY命令 -ADD除了COPY功能还有解压功能 添加远程文件/目录使用curl或wget ENV #环境变量,尽可能使用ENV增加可维护性 ENV MYSQL_VERSION 5.6 #设置一个mysql常量 RUN yum install -y mysql-server=“${MYSQL_VERSION}” -------------------------------------------------------------------------- VOLUME and EXPOSE 存储和网络 RUN and CMD and ENTRYPOINT RUN:执行命令并创建新的Image Layer CMD:设置容器启动后默认执行的命令和参数 ENTRYPOINT:设置容器启动时运行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo ”hello docker” ENTRYPOINT echo “hello docker” Exec格式 RUN [“apt-get”,”install”,”-y”,”vim”] CMD [“/bin/echo”,”hello docker”] ENTRYPOINT [“/bin/echo”,”hello docker”] 通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量 ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"] CMD 容器启动时默认执行的命令 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略 如果定义多个CMD,只有最后一个执行 ENTRYPOINT 让容器以应用程序或服务形式运行 不会被忽略,一定会执行 最佳实践:写一个shell脚本作为entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [“docker-entrypoint.sh] EXPOSE 27017 CMD [“mongod”] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
# 使用Dockerfile 打包一个flask的web的docker 确保app.py和dockerfile在同一个目录! 1.准备好app.py的flask程序 [root@master home]# cat app.py from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080) [root@master home]# ls app.py Dockerfile 2.编写dockerfile [root@master home]# cat Dockerfile FROM python:2.7 LABEL maintainer="Chao Yu<yc_uuu@163.com>" RUN pip install flask COPY app.py /app/ WORKDIR /app EXPOSE 8080 # 暴露出docker容器的8080端口 CMD ["python","app.py"] 3.构建镜像image docker build -t yuchao163/flask-hello-docker . 4.查看创建好的images docker image ls 5.启动此flask-hello-docker容器,映射一个端口供外部访问 docker run -d -p 8080:8080 yuchao163/flask-hello-docker 6.检查运行的容器 docker container ls
六,导出与导入docker镜像
导出到本地:
如果要导出镜像到本地文件,可以使用docker save命令。 [root@docker ~]# docker save centos > /opt/centos.tar.gz #导出docker镜像至本地 [root@docker ~]# ll /opt/ -rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz
从本地导入docker:
可以使用docker load从本地文件中导入到本地docker镜像库 [root@docker ~]# docker load < /opt/centos.tar.gz #导入本地镜像到docker镜像库 [root@docker~]# docker images #查看镜像导入情况 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB
学无止境!

浙公网安备 33010602011771号