Docker入门手记

in 其它程序人生 with 0 comment

前言

本人是参照于:https://yeasy.gitbooks.io/docker_practice/content/学习Docker,因每次翻查略有不便,把部分认为对于我比较重要的内容写在这里以作记录。

本文保持不定时更新:http://www.lucien.ink/archives/301/

安装Docker

个人表示用的清华大学的源,直接傻瓜安装就成功了。

sudo apt install docker

yum install docker

镜像加速

Docker Hub直接获取镜像实在是太慢了,类似于Linux里的换软件源,Docker也可以自定义镜像的来源,这里采用官方提供的国内加速服务。

配置镜像

Ubuntu 14104、Debian 7 Wheezy

编辑/etc/default/docker文件,在其中的DOCKER_OPTS中配置加速器地址:

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

Ubuntu 16.04+、Debian 8+、CentOS 7

/etc/docker/daemon.json中写入如下内容(如果文件不存在的话新建该文件,一定要保证该文件符合 json 规范,否则 Docker 将不能启动)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

重启服务使镜像生效

sudo systemctl daemon-reload
sudo systemctl restart docker

获取镜像

从 Docker 镜像仓库获取镜像的命令是docker pull,其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过docker pull --help看到。

对于Docker Hub,如果不给出用户名,则默认为官方镜像。

docker pull ubuntu:16.04

上面的命令中没有给出Docker镜像仓库地址,因此将会从Docker Hub获取镜像。而镜像名称是ubuntu:16.04,因此将会获取官方镜像library/ubuntu仓库中标签为16.04的镜像。

创建/运行容器

有了镜像之后,就可以创建或运行容器了。

据我目前的认知,如果本地没有指定的映像的时候Docker会自动下载镜像,在运行容器时如果没有指定容器则会自动创建一个容器。

docker run -dit -p 8080:80 ubuntu:16.04

执行这条命令来以守护态(保持在后台)运行那个我们刚才下载的镜像,其中-dit是守护态,-p 8080:80是将本地的8080端口映射至容器的80端口,ubuntu:16.04是镜像的名称。

$ docker run -dit -p 8080:80 ubuntu:16.04
229125e81ab57b10a4129c7b592bf10e353e7baaf4a33d16201b49139f701624

我们可以通过docker container ls来查看后台的所有容器。

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
229125e81ab5        ubuntu:16.04        "/bin/bash"         18 seconds ago      Up 17 seconds       0.0.0.0:8080->80/tcp   focused_lamarr

进入容器

执行docker exec -it <容器ID> bash就可以进入容器内部,看到熟悉的bash界面。

[root@CentOS-Server ~]$ docker run -dit -p 8080:80 ubuntu:16.04
229125e81ab57b10a4129c7b592bf10e353e7baaf4a33d16201b49139f701624

[root@CentOS-Server ~]$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
229125e81ab5        ubuntu:16.04        "/bin/bash"         18 seconds ago      Up 17 seconds       0.0.0.0:8080->80/tcp   focused_lamarr

[root@CentOS-Server ~]$ docker exec -it 229125e81ab5 bash

root@229125e81ab5:/$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

然后就可以开始随意瞎搞了。

终止容器

docker kill <容器ID>

可以终止一个运行中的容器。需要注意的是,除非你将更改应用至镜像,否则对每个容器的更改都是临时的(据我观察是这样的)。

导入和导出

导出容器

如果要导出本地某个容器,可以使用docker export <容器ID> > <导出后的名字>.tar命令,通常称导出后的tar快照

[root@CentOS-Server ~]$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
afa433a465e7        ubuntu:16.04        "/bin/bash"         3 minutes ago       Up 3 minutes                            silly_pike

[root@CentOS-Server ~]$ docker export afa433a465e7 > test.tar

[root@CentOS-Server ~]$ ls
test.tar

这样一来容器就被导出到本地的test.tar中了。

导入容器快照

cat <快照名>.tar | docker import - <镜像名>[:标签]

[root@CentOS-Server ~]$ cat test.tar | docker import - test/ubuntu:1.0
sha256:6fa4015b56ca246babc800ed6420d4b3af08921e8e7ce64f0899fbacc8b2a390

[root@CentOS-Server ~]$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         1.0                 6fa4015b56ca        9 seconds ago       183 MB
docker.io/ubuntu    16.04               578c3e61a98c        2 weeks ago         223 MB

这样一来我们刚才对容器做出的改变就被保存成了一个镜像。

其它命令集

$ docker ps // 查看所有正在运行容器
$ docker stop <容器ID>

$ docker ps -a // 查看所有容器
$ docker ps -a -q // 查看所有容器ID

$ docker stop $(docker ps -a -q) //  stop停止所有容器
$ docker  rm $(docker ps -a -q) //   remove删除所有容器
Responses