安装docker-ce(设置清华大学镜像站为镜像源)
在centos7 yum仓库 的extras仓库中自带了docker源,都是docker 1.13版本,不建议使用老版本docker.
清华大学在镜像站中给docker做了镜像
在此目录下找到docker的repo文件
我们可以自己建一个docker镜像源仓库,首先要把该repo文件下载到/etc/yum.repos.d 中
下载后打开docker-ce.repo文件,文件中指向的地址是docker官方站点,这个下载速度是很慢的,因此还要修改下载路径
仍然选择清华大学镜像站,来到这个目录下,选择稳定版
可以看到这里有最新版本18.06
选择复制链接中的linux父目录https://mirrors.tuna.tsinghua.edu.cn/docker-ce/然后全局替换docker-ce.repo中的官方地址的linux的父目录
用vim打开,在末行模式下进行替换
可以看到替换成功
yum repolist 显示所有仓库,可以看到存在docker-ce的程序包
yum install docker-ce ,完成
启动docker
1 | systemctl start docker |
设置开机自启动
1 | systemctl enable docker |
很简单
镜像是运行docker容器的基础,容器运行前,必须存在对应的镜像,如果本地没有对应的镜像,docker会自动从默认仓库(DockerHub) 下载镜像,如果有本地镜像,也可以从本地仓库下载镜像
获取镜像的主要方式是从共有仓库(DockerHub)下载
搜索并下载镜像(例如调用ubuntu镜像)
1 | 1.docker search ubuntu 搜索ubuntu镜像 |
其中列出了查找到的镜像名称、描述、星级、官方 、自动化的
1 | 2.docker pull ubuntu 下载镜像 |
1 | 3.docker images 查看已经下载的镜像文件 |
参数含义:
REPOSITORY : 镜像来源于哪个仓库
TAG : 镜像标签
IMAGE ID : 镜像id(唯一标识镜像)
CREATED : 镜像创建时间
SIZE : 镜像大小,优秀的镜像往往体积小
- 如果不指定镜像系统版本,则会下载最新版本镜像,也可以通过指定TAG的方法来下载特定版本的镜像,在生产中不应忽略镜像标签信息或使用默认的latest标签,内容是不稳定的。
- docker pull 默认从Docker Hub Registry仓库下载镜像,如果从非官方仓库下载,则需要在仓库名称前指定完整的仓库地址 例如docker pull hub.c.163.com/public/ubuntu14.04 即从网易下载
docker tag 为本地镜像任意添加新的标签1
4.docker tag ubuntu:latest myubuntu:latest
该命令添加的标签实际起到了类似链接的作用
1 | 5.docker inspect 获取镜像详细信息(元数据) |
返回的时json格式信息,如果想要其中一项内容时,使用-f参数来指定
1 | docker inspect -f {{.RepoTag}} ImageID |
1 | 6.docker history 查看镜像历史 |
镜像文件由多个层组成,docker history 可以查看镜像的创建过程
启动一个基于该ubuntu镜像的容器,并进入该容器
1 | 7.docker run -idt ubuntu /bin/bash |
-i是为了让容器能接受用户的输入,-t是指定docker为容器创建一个tty1
9.df -TH 查看容器文件系统的磁盘使用
保存和载入镜像
用户可以将镜像保存到本地以载入使用,或者将其复制到另外的文件系统1
10.docker save -o ubuntu_latest_save.tar ubuntu:latest 保存镜像
可以把保存的镜像文件载入到系统中,并载入标签等镜像文件的元数据
1 | 11.docker load < ubuntu_latest_save.tar 载入镜像 |
删除镜像
查询后可以看到镜像id
1 | 13.docker rmi IMAGE ID |
报错为该镜像被683容器所使用,需要先删除基于这个镜像所创建的容器
docker ps -a 查询容器可以看到存在基于镜像ubuntu的容器
状态为UP ,表示正在运行
1 | 14.docker stop CONTAINER ID 停止容器 |
1 | 15.docker rm CONTAINER ID删除该容器 |
1 | 16.docker rmi IMAGE ID |
镜像已经删除。其中删除容器为rm 删除镜像为rmi。可以在待删除的镜像名称前面加参数-f ,强制删除。
后来在DockerFile中推荐以下的命令写法
1 | 17.docker container stop |
创建镜像
创建镜像有三种方法,分别是基于本地模板导入镜像、基于已有镜像的容器创建镜像,基于Dockerfile 创建镜像
1> 基于本地模板导入镜像
如果本地有镜像的模板文件,可以基于该模板创建镜像,镜像模板文件也可以从OpenVZ下载
wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz 下载模板文件
下载完成后,执行以下命令,可以用该模板文件创建文件
1 | 20.cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu-14.04_minimal_amd64 |
其中 docker import:从归档文件中创建镜像
用法:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
可以看到刚刚导出的镜像,启动并运行
2>基于已有的镜像容器创建镜像
接上图
在容器中新建一个for_new_image 目录
与原容器相比此时已经发生变化,,可以提交为新镜像
1 | 21.docker commit -m "creatd new dir" -a "root" 87acd63067e1 new_ubuntu |
其中 docker commit :从容器创建一个新的镜像。
语法: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
提交成功后会返回镜像ID,可以看到新镜像已经存在
3> 基于Dockerfile 创建镜像
Dockerfile 是一种被Docker程序解释的脚本,每条指令对应linux下的一条命令, Docker程序可以读取Dockerfile脚本,根据指令生成定制的镜像。
Dockerfile指令分为构建指令和设置指令。构建指令用于构建镜像,不会在容器的镜像上运行;设置指令用于设置镜像属性,其操作可以在容器的镜像上执行
(1)FROM
构建指令,用于指定基础镜像,必须指定,且必须在Dockerfile所有指令之前指定,因为后续指令都依赖该指令指定的镜像,,可以指定DockerHub中的镜像,也可以指定本地仓库中的
(2)MAINTAINER
构建指令,用于将镜像制作者相关信息写入镜像中,当我们对该镜像执行docker inspect 命令时,会显示该字段
(3)RUN
构建指令,用于执行任何被基础镜像所支持的命令,例如ubuntu基础镜像只能使用ubuntu命令,centos基础镜像只能使用centos命令
(4)CMD
设置指令,用于指定容器启动时执行的操作,可以执行自定义脚本,亦可以执行系统命令,,此命令只能在Dockerfile脚本中设置一次,设置多个只会执行最后一个
(5)ENTRYPOINT (entrypoint)
设置指令,用于指定容器启动时执行的命令,可以在Dockerfile脚本中设置多次,只有最后一个有效
ENTRYPOINT 使用分两种情况 :
独自使用时,如果同时使用了CMD命令,且CMD指定的是一个完整可执行命令,那么二者会互相覆盖,只有写在最后的那条指令有效;
与CMD指令配合使用,CMD指令可以指定ENTRYPOINT的默认参数,此时CMD指令指定的仅仅是参数部分,而ENTRYPOINT需要使用JSON方式指定需要执行的命令但不能使用参数
(6)USER
设置指令,用于设置启动容器的用户,默认为root
(7)EXPOSE
设置指令,用于将容器中的端口映射称为宿主机中的摸个端口。极大方便了访问容器 。 宿主机IP:PORT
需要两步操作,首先在Docerfile中使用 EXPOSE设置需要映射的容器端口号,然后在 docker run 中使用参数 -p 指定前面的端口号,该端口号就会被随机映射称为宿主机中的一个端口号,也可以指定需要映射到宿主机的哪个端口,但要注意指定的端口没有被占用。
端口映射是Docker比较重要的一个功能,因为每次运行容器时,容器IP不能被指定,而是桥接模式网卡随机生成的,但是宿主机IP地址是固定的,将容器端口映射称为宿主机上的一个端口,可以免去每次访问容器时都要查看容器IP的麻烦
一个运行中的容器,使用 ==docker port CONTAINER ID== 查看该端口号在宿主机上的映射端口
(8) ENV (environment)
构建指令,用于在镜像中设置一个环境变量,设置成功后,后续的RUN 指令都可以使用该指令设置的环境
(9)ADD
构建指令,用于把本地文件添加到容器,默认所有拷贝到容器中文件和文件夹权限为755(-rwxr-xr-x),UID和GID为0,如果是一个目录,那么会将该目录下的所有文件添加到容器,但不包括目录;如果文件是可识别的压缩格式,则docker会进行解压缩
(10)VOLUME
设置指令, 指定挂载点,用于使容器中某个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用
由于容器使用AUFS文件系统,不能持久化数据,容器关闭后,所有更改也会消失,因此容器有应用持久化数据存储的需求时,可以使用该指令
(11)WORKDIR
设置指令,可以多次切换目录(cd),可以在RUN, CMD, ENTRYPOINT 命令前使用
(12) COPY (src)…(dest)
复制本地主机 src (为Dockerfile所在目录的相对路径、文件或目标)下的内容到镜像中的 dest 下。路径不存在时会自动创建。支持正则。
下面展示一则使用Dockerfile创建Tomcat镜像的实例
1 | #Pull base image // 获取基础镜像 |
或
运行Dockerfile要在Dockerfile所在的目录,”./“应为Dockerfile脚本所在目录,否则就会报上下文环境的错误,MV、COPY、ADD的文件位置都是相对于/root 来说的
第一遍执行(使用的第一条命令)时出现很多错误,最后修改成功了,以下截图是第二遍执行(第二条命令) 因此会报使用缓存
在下载jdk的时候,需要加上cookie,没加时出现以下报错
Java和Tomcat程序的安装包下载地址可能会发生变化,因此使用该脚本时先根据实际下载地址对其进行修改,包括解压后的生成路径也会有改变
运行镜像,启动一个基于镜像tomcat的容器,宿主机输入http://localhost:8090 即可访问tomcat