基础知识
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
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
同一个repository可以有多个tag,表示这个仓库源的不同版本,所以使用repository:tag来运行容器。如果不指定tag,则默认使用latest。使用docker search + XXX 搜索image名称
拉取image
此时可以拉取一下:
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
在容器内apt-get update,完成后exit
提交更新
docker commit -m="update done" -a="pxy" b6a9cd1486a6 pxy/ubuntu:1214
说明:
-m是提交的描述信息
-a是指定镜像作者
b6a9cd1486a6是容器ID,不是Image ID
pxy/ubuntu:1214是respository:tag
现在再查看images,发现新的有了:
在镜像里装软件
就在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
上传镜像到dockerhub
首先需要在https://hub.docker.com/注册账号并激活。我在上面创建了一个仓库,是pxy7896/ubuntu。那么我想把pxy/ubuntu:1214传到那个仓库上,要怎么办呢?
1.修改repository名称:用Image Id修改
docker tag c4affa5614a9 pxy7896/ubuntu:1214
改完多了记录:
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
此时在线可以查看
补充:在线的话创建一个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)