基础知识

Docker 包括三个基本概念:

  1. 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  2. 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  3. 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
  4. docker构建基础镜像 docker的基础镜像是什么_docker

ubuntu安装Docker-ce

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update
sudo apt install apt-transport-https ca-certificates software-properties-common curl
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
sudo docker run hello-world

启动docker-ce

sudo systemctl enable docker
sudo systemctl start docker

查看images

docker images

docker构建基础镜像 docker的基础镜像是什么_docker_02


同一个repository可以有多个tag,表示这个仓库源的不同版本,所以使用repository:tag来运行容器。如果不指定tag,则默认使用latest。使用docker search + XXX 搜索image名称

docker构建基础镜像 docker的基础镜像是什么_docker_03

拉取image

docker构建基础镜像 docker的基础镜像是什么_ubuntu_04


此时可以拉取一下:

docker pull hello-world

运行

docker run hello-world

删除镜像

$ docker rmi hello-world

更新ubuntu镜像

docker run -t -i ubuntu /bin/bash

解释:交互式地打开ubuntu(没指定tag,所以是最新版本)
tty是啥?TTY是由虚拟控制台,串口以及伪终端设备组成的终端设备。

~$ docker run --help
...
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit

docker构建基础镜像 docker的基础镜像是什么_ubuntu_05


在容器内apt-get update,完成后exit

docker构建基础镜像 docker的基础镜像是什么_docker构建基础镜像_06


提交更新

docker commit -m="update done" -a="pxy" b6a9cd1486a6 pxy/ubuntu:1214

说明:

-m是提交的描述信息

-a是指定镜像作者

b6a9cd1486a6是容器ID,不是Image ID

pxy/ubuntu:1214是respository:tag

现在再查看images,发现新的有了:

docker构建基础镜像 docker的基础镜像是什么_ubuntu_07

在镜像里装软件

就在pxy/ubuntu:1214里装vim。这里可以看到容器ID又变了

pxy@pxy-pc:~$ docker run -t -i pxy/ubuntu:1214 /bin/bash
root@6a6d5e1d2381:/# apt-get install vim
Reading package lists... Done
...
root@6a6d5e1d2381:/home# exit

需要提交更新,不然不会保留变化的(我没commit,再次登录后vim消失了,再来一次吧!记住教训T_T)
此时Image ID也会发生变化。

docker commit -m="install vim" -a="pxy" a14b36b99165 pxy/ubuntu:1214

docker构建基础镜像 docker的基础镜像是什么_linux_08

上传镜像到dockerhub

首先需要在https://hub.docker.com/注册账号并激活。我在上面创建了一个仓库,是pxy7896/ubuntu。那么我想把pxy/ubuntu:1214传到那个仓库上,要怎么办呢?
1.修改repository名称:用Image Id修改

docker tag c4affa5614a9 pxy7896/ubuntu:1214

改完多了记录:

docker构建基础镜像 docker的基础镜像是什么_docker_09


2.登录

docker login

** Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout **这个可能是网络问题,再试一次,成功会提示Login Succeeded。
登出是

docker logout

3.push

docker push pxy7896/ubuntu:1214

此时在线可以查看

docker构建基础镜像 docker的基础镜像是什么_git_10


补充:在线的话创建一个repository叫ubuntu。在线创建后是没有tag的,本地push的时候带上自己的tag就完了,push完去docker hub检查就可以了。

从0开始构建镜像

首先制造一个Dockerfile,内容是

FROM    centos:6.9
MAINTAINER      pxy "pxy@163.com"

RUN     /bin/echo 'root:123456' | chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' | chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。FROM指定的是镜像源,RUN是每一条指令。

使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。其中-t是目标镜像名,点号表示使用当前文件夹下的Dockerfile。

docker build -t runoob/centos:6.9 .

再运行镜像,确认已经加入用户了:

pxy@pxy-pc:~/Desktop$ docker run -t -i runoob/centos:6.9 /bin/bash
[root@2409d8ebfd0f /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)