上一篇是介绍了docker概述以及docker中核心基本概念:镜像、仓库、容器,并在linux上安装了docker,设置了阿里云加速,并且下载了几个镜像。这一篇我们介绍docker镜像、仓库、容器管理。
一、镜像
1.1 查看本地仓库中所有镜像
root@ubuntu16server:/home/yufeiliu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.16.0 18ff9f3390d6 47 hours ago 109MB
nginx 1.15.12 53f3fd8007f7 47 hours ago 109MB
mysql 5.6 73829d7b6139 2 days ago 256MB
ubuntu latest d131e0fa2585 13 days ago 102MB
1.2 从远程仓库中下载
root@ubuntu16server:/home/yufeiliu# docker pull node
Using default tag: latest
latest: Pulling from library/node
Digest: sha256:ce2fa85adcf94c2366f2d8dfe1f6471451020f8bdb663c691192fddcceacc978
Status: Image is up to date for node:latest
root@ubuntu16server:/home/yufeiliu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node latest 502d06d3bfdf 27 hours ago 906MB
nginx 1.16.0 18ff9f3390d6 47 hours ago 109MB
nginx 1.15.12 53f3fd8007f7 47 hours ago 109MB
mysql 5.6 73829d7b6139 2 days ago 256MB
ubuntu latest d131e0fa2585 13 days ago 102MB
1.3 打tag
root@ubuntu16server:/home/yufeiliu# docker tag ubuntu:latest ubuntu:123
root@ubuntu16server:/home/yufeiliu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node latest 502d06d3bfdf 27 hours ago 906MB
nginx 1.16.0 18ff9f3390d6 47 hours ago 109MB
nginx 1.15.12 53f3fd8007f7 47 hours ago 109MB
mysql 5.6 73829d7b6139 2 days ago 256MB
ubuntu 123 d131e0fa2585 13 days ago 102MB
ubuntu latest d131e0fa2585 13 days ago 102MB
这里其实我们就应该可以猜到docker的基本原理了,为了节省镜像大小,采用的指针的方式,每一次变更都是一层,最终将所有层放在一起就是一个完整的镜像。ubuntu:123这是一个新镜像,但是由于层相同所以它们的imageID是一样的。
1.4 删除镜像
root@ubuntu16server:/home/yufeiliu# docker rmi ubuntu:123
Untagged: ubuntu:123
root@ubuntu16server:/home/yufeiliu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node latest 502d06d3bfdf 27 hours ago 906MB
nginx 1.16.0 18ff9f3390d6 47 hours ago 109MB
nginx 1.15.12 53f3fd8007f7 47 hours ago 109MB
mysql 5.6 73829d7b6139 2 days ago 256MB
ubuntu latest d131e0fa2585 13 days ago 102MB
1.5 创建镜像
创建一个新镜像有两种做法,我们可以启动一个容器,在容器中做一些操作,然后将这个容器保存成为镜像。第二种是使用dockerfile直接由镜像产生镜像,这种方式更加实用。
一般情况下我们是写出dockerfile,但是dockerfile执行什么命令?怎么执行?我们需要参考容器安装。
1.5.1 容器方式创建新镜像
我这里创建一个jdk的镜像,就是在ubuntu镜像中安装jdk。大致步骤:
1、基于ubuntu:latest启动容器
2、将jdk包从宿主机拷贝到容器中
3、完成安装
4、将容器搞成镜像
5、上传到远程仓库中
1.5.1.1 启动容器
root@ubuntu16server:/home/yufeiliu# docker run -it ubuntu:latest /bin/bash
root@7ecae32c4273:/# cd /home/
root@7ecae32c4273:/home# ls
root@7ecae32c4273:/home# mkdir software work
root@7ecae32c4273:/home# ls
software work
root@7ecae32c4273:/home# exit
exit
这里需要说明几点:
1、参数-i表示交互,-t表示带有终端
2、/bin/bash表示容器启动的程序,这一点是和虚拟机最大的不同,虚拟机启动是回启东一坨进程,但是容器启动只会启动必要进程,其他进程需要用户指定才会启动,比如/bin/bash需要用户单独启动。
3、启动完成之后我创建了两个文件夹,用于后续安装使用。我需要将安装包拷贝到容器中,所以我需要退出容器
1.5.1.2 上传文件
root@ubuntu16server:/home/yufeiliu# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu16server:/home/yufeiliu# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ecae32c4273 ubuntu:latest "/bin/bash" 48 seconds ago Exited (0) 27 seconds ago wizardly_stallman
root@ubuntu16server:/home/yufeiliu# docker cp /home/yufeiliu/software/jdk-8u144-linux-x64.tar.gz 7ecae32c4273:/home/software
root@ubuntu16server:/home/yufeiliu# docker restart 7ecae32c4273
7ecae32c4273
root@ubuntu16server:/home/yufeiliu# docker attach 7ecae32c4273
root@7ecae32c4273:/# cd /home/software/
root@7ecae32c4273:/home/software# ls
jdk-8u144-linux-x64.tar.gz
root@7ecae32c4273:/home/software#
说明:
1、docker ps查看所有运行状态的docker容器,由于我已经执行exit,/bin/bash这个进程已经结束,所以容器处于结束状态
2、docker ps -a查看所有状态的docker容器,找到了我们的容器
3、使用docker cp命令用于宿主机和容器之间拷贝文件
4、这时候容器已经有了这个文件,我需要让它重新运行,所以使用docker restart
5、重启之后我们发现没有按照希望的那样有bash交互,所以我们需要使用docker exec或者docker attach进入容器中,完成安装工作
1.5.1.3 打成镜像并上传到远程仓库
root@ubuntu16server:/home/yufeiliu# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ecae32c4273 ubuntu:latest "/bin/bash" 18 minutes ago Up 11 minutes wizardly_stallman
root@ubuntu16server:/home/yufeiliu# docker commit
"docker commit" requires at least 1 and at most 2 arguments.
See 'docker commit --help'.
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
root@ubuntu16server:/home/yufeiliu# docker commit 7ecae32c4273 jdk:2.0
sha256:c64bad75d6a69ab6a430c51b80aca7a9d14143cb2882be7e8aef8c6fd916b3d8
1.5.2 dockerfile方式创建新镜像
root@ubuntu16server:/home/yufeiliu/work/docker/jdk-3.0# cat Dockerfile
FROM ubuntu
MAINTAINER yufei.liu
RUN mkdir -p /home/software
COPY jdk-8u144-linux-x64.tar.gz /home/software/jdk-8u144-linux-x64.tar.gz
WORKDIR /home/software
RUN tar -zxvf jdk-8u144-linux-x64.tar.gz
ENV JAVA_HOME /home/software/jdk1.8.0_144/
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
只需要执行:
docker build jdk:3.0 .
注意:
1、文佳名是Dockerfile
2、将上传的文件jdk-8u144-linux-x64.tar.gz放在Dockerfile文件同级