上一节学习和实践了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<cwqsolo@163.com>
#更新源
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]#