docker教程之从一头雾水到不一头雾水(2)
运行镜像
先查看下本地有哪些镜像
[root@ichz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest 49f7960eb7e4 9 days ago 200 MB
运行镜像,在刚刚pull的centos镜像里输出一行hello world,可以使用REPOSITORY,也可以使用IMAGE ID
[root@ichz ~]# docker run 49f7960eb7e4 echo helloe world helloe world [root@ichz ~]# docker run centos echo helloe world helloe world
各个选项说明:
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像的标签
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
runoob@runoob:~$ docker search httpd
更新镜像
我们可以通过命令 docker commit来提交容器副本。
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
-
-m:提交的描述信息
-
-a:指定镜像作者
-
e218edb10161:容器ID
-
runoob/ubuntu:v2:指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2:
runoob@runoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE runoob/ubuntu v2 70bf1840fd7c 15 seconds ago 158.5 MB ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B
使用我们的新镜像 runoob/ubuntu 来启动一个容器
runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash
root@1a9fbdeb5da3:/#
构建镜像
1、基于已有的镜像的修改,创建一个新的镜像
[root@206 ~]# docker run -ti ubuntu:17.10 /bin/bash root@23a9ebc23cc5:/#
23a9ebc23cc5是容器的id
我们在运行的这个容器中进行修改
root@23a9ebc23cc5:/# mkdir test
然后退出
root@23a9ebc23cc5:/# exit
[root@206 ~]# docker commit -m "this is a new images" -a "root" 23a9ebc23cc5 newubuntu:8888
查看镜像,发现多了一个
[root@206 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE newubuntu 8888 036d21b62a12 2 minutes ago 89.6 MB ubuntu 17.10 073e7b409b9b 37 hours ago 89.6 MB
2、使用本地模版导入镜像
[root@206 ~]# wget http://download.openvz.org/template/precreated/suse-13.1-x86-minimal.tar.gz
生成镜像
[root@206 ~]# cat suse-13.1-x86-minimal.tar.gz | docker import - newsuse:99999
看一下,又多了一个
[root@206 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE newsuse 99999 7e4ff5f67461 4 seconds ago 156 MB newubuntu 8888 036d21b62a12 19 minutes ago 89.6 MB ubuntu 17.10 073e7b409b9b 37 hours ago 89.6 MB
3、使用Dockerfile
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
新建Dockerfile文件
[root@ichz ~]# touch Dockerfile
写入内容
[root@ichz ~]# cat Dockerfile
FROM alpine:latest
MAINTAINER xbf
CMD echo "Helloe Docker!"
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源,镜像alpine是专门为Docker准备的一个小巧的环境。
MAINTAINER xbf是告诉别人该镜像共享给别人是谁创建的。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
[root@ichz ~]# docker build -t hello_docker .
Sending build context to Docker daemon 8.842 MB
Step 1/3 : FROM alpine:latest
Trying to pull repository docker.io/library/alpine ...
latest: Pulling from docker.io/library/alpine
ff3a5c916c92: Pull complete
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for docker.io/alpine:latest
---> 3fd9065eaf02
Step 2/3 : MAINTAINER xbf
---> Running in 9445777fca4c
---> 4e250ecc7557
Removing intermediate container 9445777fca4c
Step 3/3 : CMD echo "Helloe Docker!"
---> Running in d5b5ad566ad1
---> 65d690c9d782
Removing intermediate container d5b5ad566ad1
Successfully built 65d690c9d782
参数说明:
-
-t :指定要创建的目标镜像名
-
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径,这里的.指的是当前目录
[root@izchz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello_docker latest 65d690c9d782 6 minutes ago 4.15 MB docker.io/centos latest 49f7960eb7e4 12 days ago 200 MB docker.io/stephenreed/jenkins-java8-maven-git latest 3670d4afa617 2 months ago 682 MB docker.io/alpine latest 3fd9065eaf02 5 months ago 4.15 MB docker.io/stephenreed/java8-jenkins-maven-git-nano latest 508ef553bf1a 3 years ago 1.5 GB
运行下刚刚创建的hello_docker镜像
[root@iz2zeh5mjwg5u2vl2fawchz ~]# docker run hello_docker
Helloe Docker!
更多docker创建镜像示例
dockerfile+ubuntu+nginx搭建web环境
设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
删除镜像
[root@206 test]# docker rmi newubuntuutu1
没有指定tag的时候,删除的是tag为latest的镜像,如果有个名为newubuntuutu1但是tag是其他的时候,这个镜像是不能删除的,除非删除的时候指定tag
[root@206 test]# docker rmi newsuse:99999
[root@206 test]# docker run -ti newubuntuutu1:latest /bin/bash
然后删除这个镜像,提示不能删除
[root@206 test]# docker rmi newubuntuutu1:latest Error response from daemon: conflict: unable to remove repository reference "newubuntuutu1:latest" (must force) - container e9a6eeb12f6e is using its referenced image 3d077336fcf6
我们需要先关闭容器 容器id为e9a6eeb12f6e我们只需要写前四位
[root@206 test]# docker rm e9a6
然后再执行docker rmi newubuntuutu1:latest即可
镜像的存出(导出、备份)与载入(导入、恢复)
备份
[root@206 test]# docker save -o ubuntu-bak.tar ubuntu:17.10 [root@206 test]# ls Dockerfile ubuntu-bak.tar
删除这个镜像
[root@206 test]# docker rmi ubuntu:17.10
载入
[root@206 test]# docker load --input ubuntu-bak.tar Loaded image: ubuntu:17.10
写时复制机制
写时复制机制(copy-on-write),是一种在Linux中引入的只有进程空间的各段内容要发生变化时,才把父进程的内容复制给子进程的一种处理机制。
要创建一个子进程,通常的做法是
写时复制机制(copy-on-write)中,通常情况的做法是(只要父进程相应段不改变,就这么做):
写时复制机制(copy-on-write)中,当父进程相应段要更改,才:
Docker中,采用写时复制机制来创建根文件系统,这样的话不会导致庞大的内存的开销,所以可以节省大量内存和硬盘空间,可以让Docker的部署更方便快捷。
docker hub
[root@206 test]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://69e9963d.m.daocloud.io
镜像分发
安装git,并配置密钥
[root@206 test]# yum -y install git [root@206 test]# ssh-keygen -t rsa -C "centos" [root@206 test]# cd ~/.ssh/ [root@206 .ssh]# ls id_rsa id_rsa.pub
复制id_rsa.pub的内容,并打开github 的setting配置
github新建一个仓库,拉取到本地
[root@206 /]# git clone git@github.com:itliucheng/docker-test1.git
将之前save的tar文件放入
[root@206 /]# cp /test/ubuntu-bak.tar docker-test1/
提交到github
[root@206 docker-test1]# git add ubuntu-bak.tar [root@206 docker-test1]# git commit -m "add a images" [root@206 docker-test1]# git push origin master
之后别人可以下载该文件并恢复为镜像