上一节学习和实践了Docker的基础和安装,本节主要学习Docker的主要概念和命令
Docker有三大核心概念,分别为:镜像、容器、仓库
一、镜像
Docker镜像是运行容器的前置条件,如果本地没有镜像,Docker 会尝试从默认镜像仓库(Docker Hub中注册的)下载,用户也可以配置自己的私有仓库,从私有仓库下载镜像,这点非常重要,使得企业应用可以使用自己的仓库,解决安全隐患。
1、 获取镜像
获取镜像的命令为: docker pull ubuntu
执行这条命令,会从官方库里,将ubuntu(乌班图)的最后一个版本获取下来,既:docker pull registry.hub.docker.com/ubuntu:latest
如果想获取某个指定版本TAG,命令为: docker pull ubuntu:14.04
如果要从私有库里获取,则命令为: docker pull 192.168.136.177:5000/ubuntu 这里192.168.136.177:5000是自己的私有仓库
下载后,可以通过run命令执行 如: docker run -t -i ubuntu /bin/bash
2、查看镜像信息
使用命令: docker images可以查看当前docker环境里面的镜像信息
[root@dev-177 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.136.177:5000/appname ubuntu 710477b8876f 24 hours ago 560MB appname ubuntu 710477b8876f 24 hours ago 560MB ssh dockerfile 319c7aa50a7f 2 days ago 206MB ubuntu latest 0458a4468cbc 4 days ago 112MB registry latest d1fd7d86a825 2 weeks ago 33.3MB hello-world latest f2a91732366c 2 months ago 1.85kB sameersbn/redis latest d8f7b0e07097 6 months ago 203MB sameersbn/gitlab 8.4.4 9d1069e2b30c 23 months ago 720MB sameersbn/redmine 3.2.0-4 7eb43870e9c7 2 years ago 636MB sameersbn/postgresql 9.4-12 a100f2a18ec3 2 years ago 231MB [root@dev-177 ~]#
这里名,最重要的几个字段:
REPOSITORY 说明镜像来自于什么仓库
TAG 镜像标签,用来区分版本
IMAGE_ID 镜像的唯一标识
上面有两个镜像:192.168.136.177:5000/appname 和 appname镜像,他们的ID是相同的,说明是同一个镜像, 带IP地址的是通过docker tag 命令生成的,指向同一个镜像
这样指定后,就可以push 到自己的私有仓库192.168.136.177:5000中。
查看更详细的信息可以用命令: docker inspect IMAGE_ID 来查看某个具体的镜像信息
3、查找,删除
查找命令: docker search 关键字
按镜像名删除: docker rmi 镜像名
按镜像ID删除: docker rmi 镜像ID 会删除所有为此ID的镜像名称引用
如果镜像有被某容器使用是不能删除的,除非使用 -f 参数 docker rmi -f 镜像ID
查看当前被容器使用的镜像: docker ps -a
原则上: 先删除使用镜像的容器,再删除镜像
4、创建镜像:
镜像的创建有2种方式: commit 或者使用dockerfile 文件
当我们在运行的容器里面,修改了一些内容后,可以使用commit 命令进行创建
docker commit -m 修改内容 -a 作者 容器ID 镜像名
使用Dockerfile 文件方式,涉及如下命令:
1) FROM
必须为第一条指令,说明镜像继承自哪个基础版本
2)MAINTAINER
维护信息,指本image是谁进行维护
3) RUN
可以使用shell终端或者exec 方式来执行
4) CMD
容器启动后,执行的命令,每个Dockerfile 只能有一条CMD命令
5) EXPOSE
暴露的端口号
6)ENV
环境变量,被后续的RUN指令使用
7)ADD
复制命令,ADD src dest , src 可以是dockfile所在目录作为根目录的一个相对路径目录,也可以是url, 或者压缩文件
8)COPY
复制 COPY src dest , src 是目录
9)ENTRYPOINT
容器的入口点
其他略,下面展示一个Dockfile文件的例子
#继承于镜像ubuntu FROM ubuntu #维护人员 MAINTAINER Chen Weiqun<[email protected]> #更新源 RUN apt-get update #安装ssh RUN apt-get install -y openssh-server #安装vim RUN apt-get install -y vim #创建sshd 服务 RUN mkdir -p /var/run/sshd RUN mkdir -p /root/.ssh #取消pam登录限制 RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config #添加认证文件和启动脚本 ADD authorized_keys /root/.ssh/authorized_keys ADD run.sh /root/run.sh #修改确保run.sh执行权限 RUN chmod u+x /root/run.sh #暴露端口 EXPOSE 22 ##install JDK and TOMCAT RUN mkdir -p /usr/java RUN mkdir -p /work ADD jdk-7u80-linux-x64.gz /usr/java/ ADD tomcat /work/ #设置环境变量 ENV JAVA_HOME=/usr/java/jdk1.7.0_80 CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin RUN echo "JAVA_HOME=/usr/java/jdk1.7.0_80\nCALSSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar\nPATH=$PATH:$JAVA_HOME/bin" >> /etc/profile #暴露tomcat端口 EXPOSE 8080 EXPOSE 8009 EXPOSE 8443 #修改tomcat目录中执行的权限 RUN chmod u+x /work/app-tomcat/bin/*.sh #设置默认启动的命令 CMD ["/root/run.sh"]
5、镜像的导入导出
导出到tar 文件: docker save -o 镜像.tar 镜像名:TAG
导入: docker load --input 镜像.tar
6、上传镜像
docker push NAME[:TAG]
docker push [库]NAME[:TAG]
二、容器
容器是镜像的一个运行实例,一个镜像可以运行多个容器。每个容器是独立的,包含了镜像制作的一个或者一组应用,以及它们必须的运行环境。
1)创建容器
命令: docker create it 镜像名:TAG
可以创建一个镜像,但是没有运行起来
2) 运行
命令: docker start 容器ID
启动一个容器
3) 可以创建和运行一起
命令:docker run ubuntu /bin/echo "Hello"
这个命令创建了一个基于ubuntu镜像的容器,并运行echo 命令
4) 终止和删除容器
终止命令: docker stop 容器ID
删除容器: docker rm 容器ID
5) 容器的导入和导出
导出: docker export 容器ID > 导出文件.tar
导入: cat 导出文件.tar | docker import - 库/镜像名称:TAG
容器的导入与镜像的导入区别:容器的导入,只是当前的容器镜像,不包含历史信息和元数据。 导入后,在镜像里面可以看到有一个刚导入的镜像。
三、仓库
1、官方仓库
Docker 提供了官方的仓库,安装好docker 环境后,使用pull 命令就是从官方仓库下载镜像。由于企业应用考虑安全性问题,都会要求企业库与网络库有隔离,所以下面重点说下私有仓库
2、私有仓库
1) 下载并启动私有仓库
私有仓库由私有仓库存储于仓库管理容器组成。docker 提供了一个registry 容器来管理仓库,
使用命令: docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
这个命令,是在本机的5000端口,创建一个私有库, 存储位置: 本机的 /opt/data/registry。 registry 是官网下载的仓库管理容器名称
启动后,这个仓库就开始工作。
2) 使用私有仓库
docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
从私有库下载镜像
如: docker pull 192.168.136.177:5000/appname:ubuntu
查看私有库的镜像
[root@work-199 ~]# curl -XGET http://192.168.136.177:5000/v2/_catalog {"repositories":["appname"]} [root@work-199 ~]#
四、其他
1、docker下载的镜像到底怎么存放
[root@dev-177 docker]# pwd /var/lib/docker [root@dev-177 docker]# ls -l 总用量 16 drwx------. 2 root root 24 12月 20 15:34 builder drwx------. 4 root root 150 1月 29 19:55 containers drwx------. 3 root root 21 12月 20 15:34 image drwxr-x---. 3 root root 19 12月 20 15:34 network drwx------. 89 root root 8192 1月 29 19:55 overlay drwx------. 4 root root 32 12月 20 15:34 plugins drwx------. 2 root root 6 12月 20 15:34 swarm drwx------. 2 root root 6 1月 29 19:52 tmp drwx------. 2 root root 6 12月 20 15:34 trust drwx------. 14 root root 4096 1月 29 17:17 volumes [root@dev-177 docker]#