Docker命令行(sudo)

  • Docker容器命令行
  • 1.查看Docker服务是否正常
  • 2.运行容器(docker run -i -t 镜像名称 命令代码)
  • 3.使用容器
  • 4.查看当前系统中存在的容器:
  • 5.容器命名
  • 6.启动已停止的容器
  • 7.进行容器内部命令行
  • 8.创建守护式容器(长期运行的容器)
  • 9.查看容器日志
  • 10.查看容器内进程
  • 11.在容器内运行进程
  • 12.停止守护式容器
  • 13.自动重启容器
  • 14.查看容器详细信息
  • 15.删除容器
  • Docker镜像命令行
  • 1.查看镜像列表
  • 2.拉取镜像
  • 3.查找镜像
  • 4.构建镜像
  • 5.查看镜像的一些详细信息:
  • 6.根据我们新建的镜像来创建一个容器:
  • 7.执行Dockerfile中的所有指令并生成一个新的镜像。
  • 8.构建缓存
  • 查看新镜像
  • 从新镜像启动容器
  • 端口映射查询
  • 9.Dockerfile指令
  • 将镜像推送至Docker Hub
  • 自动构建
  • 删除镜像
  • 搭建自己的Dockers Registry
  • 使用本地的registry为我们想要推送的镜像打好标签。
  • 推送


请在root用户下执行,或在执行命令行前面加上sudo。

Docker容器命令行

1.查看Docker服务是否正常

docker info

2.运行容器(docker run -i -t 镜像名称 命令代码)

docker run -i -t ubuntu /bin/bash

-i:设置容器中的STDIN是开启的。
-t:参数表示为创建的容器分配一个伪tty终端。
(通常-i和-t两个参数会联合使用,也可以写作-it。)
/bin/bash:则指定了该容器需要运行的命令。

命令完成后,我们将会看到我们进行了该容器内的shell:

root@108ccd05bc02:/#

3.使用容器

root@108ccd05bc02:/# hostname
root@108ccd05bc02:/# cat /etc/hosts

此外,我们还可以安装一个软件包,以vim为例:

root@108ccd05bc02:/#  apt-get update && apt-get install vim

当我们使用完成该容器后,可以使用exit来退出容器。
(注意:此时,容器仅仅是停止运行,但是并没有被销毁。)

4.查看当前系统中存在的容器:

docker ps -a

ps:查询到所有正在运行的容器。
-a:无论是否在运行中,都会被查找到。

5.容器命名

默认情况下,如果没有指定容器名称,系统将会自动随机生成一个唯一的名称。

docker run --name lunhui_test -i -t ubuntu /bin/bash

–name:指定容器的名称
(一个合法的容器名称是只能由字母、数字、下划线、圆点和横线组成的。容器名称必须是唯一的)

6.启动已停止的容器

# 根据容器名称启动
docker start lunhui_test
# 根据容器id启动
docker start 67ed3e910341

重新启动容器后,将会继续沿用之前docker run运行时的参数来运行。但是,并没有直接进入到交互式shell的环境。

7.进行容器内部命令行

docker attach lunhui_test

(注意:有时在执行完该命令后,需要再次敲击一个回车才能看到交互式shell。)

8.创建守护式容器(长期运行的容器)

docker run --name lunhui_test1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-d:表示将程序放在后台执行。
执行脚本:表示每隔1s打印一个hello world,直到容器停止。

9.查看容器日志

docker logs lunhui_test1
docker logs -f -t lunhui_test1

-f:用于监控容器的日志,功能类似于tail -f。
-t:添加时间戳。

10.查看容器内进程

docker top lunhui_test1

11.在容器内运行进程

docker exec -it lunhui_test1 /bin/bash

12.停止守护式容器

docker stop lunhui_test1

13.自动重启容器

有时,我们期望由于某些意外错误而造成容器停止运行时,可以自动重启服务。

# 任务情况下都自动重启
docker run --restart=always --name lunhui_test2 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 退出代码不为0时,自动重启;且最多重启5次
docker run --restart=on-failure:5 --name lunhui_test3 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

–restart=always:总是自动重启
–restart=on-failure:5:退出代码不为0时,自动重启;且最多重启5次
(注意:默认情况下,Docker不会自动重启容器。 )

14.查看容器详细信息

docker inspect lunhui_test1

15.删除容器

docker rm lunhui_test

(注意:运行中的容器是无法直接删除的,需要先停止容器运行后才能将其删除。)

Docker镜像命令行

1.查看镜像列表

docker images

本地镜像默认保存在Docker宿主机的/var/lib/docker目录下。

2.拉取镜像

docker pull ubuntu
docker run -it ubuntu:16.04 /bin/bash

ubuntu:16.04:镜像名称
ubuntu:仓库名称。
16.04:tag,区分同一个仓库中不同的镜像,不写默认为latest。

镜像分为两个类别:

  1. Docker用户自己创建的用户仓库,完整名称是由用户名称/仓库名称组成的。
  2. Docker官方维护的顶层仓库。没有用户名称,直接是仓库名称。

仓库完整格式如下:

[用户名称/]仓库名称:tag。

在使用docker run从一个镜像启动容器时,Docker首先会现在本地查找是否存在该镜像。如果在本地没有找到该镜像,则会先从Dockers Hub上下载该镜像后在运行。如之前所说,如果没有指定tag,则默认使用latest标签。

3.查找镜像

sudo docker search 关键字

4.构建镜像

构建镜像的方式有以下两种:

  1. 使用docker commit构建
  2. 使用docker build和Dockerfile文件来构建(推荐)

(一般来说,我们并非从零开始构建一个镜像,而是从一个base镜像开始修改构建的。)

创建docker hub账号 https://hub.docker.com/
通过命令行在本地绑定对应的Docker Hub账号。

sudo docker login

通过docker commit来修改镜像

流程简介如下:

  1. 根据某个镜像创建一个容器
  2. 对该容器进行一些修改
  3. 提交该容器并生成一个新的镜像。

示例:

# 根据ubuntu镜像创建了一个容器,容器id为b3f9427a5039
sudo docker run -it ubuntu /bin/bash
# 接下来,我们对这个容器进行了一些修改,例如安装了Apache
root@d0ac3248dfe:/# apt-get -yqq update
root@d0ac3248dfe:/# apt-get -y install apache2
# 安装完成后,退出该容器
root@d0ac3248dfe:/# exit
# 使用commit命令来创建一个新的镜像(lunhui用户下的apache镜像)
sudo docker commit d0ac3248dfe lunhui/apache2
sudo docker commit -m="install apache" --author="lunhui" d0ac3248dfe lunhui/apache2:v1

-m=”message”:可以用于对提交的镜像添加一些文本描述,
–author=”person”:可以用于添加提交人信息,
提交时,我们可以设置tag。

5.查看镜像的一些详细信息:

docker inspect lunhui/apache2:v1

6.根据我们新建的镜像来创建一个容器:

sudo docker run -it lunhui/apache2:v1 /bin/bash

使用dockerfile来构建镜像(推荐)

# 创建一个工作目录,并在目录中创建一个Dockerfile文件
mkdir workdir
cd ./workdir
touch Dockerfile

workdir:构建环境,Docker会在构建镜像时将构建上下文和该文件上下文的文件和目录传递给Docker守护进程。
编辑Dockerfile如下:

# Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER Wangzhe0912 "Wangzhe0912@tju.edu.cn"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "Hi, I am your contrainer" > /usr/share/nginx/html/index.html
EXPOSE 80

这段代码的含义:

  • FROM:用于制定一个已经存在的镜像,后续指令都是基于该镜像来运行。这个镜像我们称之为基础镜像。每个Dockerfile的第一行指令都应该是FROM开头。
  • MAINTAINER:说明该作者和作者邮箱信息。
  • RUN:默认情况下,指令后的内容会通过/bin/sh -c来执行。
  • EXPOSE:指定容器内的应用程序会使用哪些端口(可以指定多个)。出于安全考虑,默认Docker不会自动打开这些端口,需要在docker run指令中指定需要打开的端口。

运行过程中的机制:

  1. 首先从基础镜像ubuntu:14.04中启动一个容器
  2. 执行一条run指令
  3. 执行类似commit指令,提交一个新的镜像层。
  4. 基于步骤3提交的镜像运行一个新的容器。
  5. 返回步骤2,继续执行下一条运行指令,直至没有运行指令。

Ps:这样的优点的如果在Dockerfile中,存在某个步骤执行失败,我们将会得到上一步中生成的镜像,利用该镜像,我们可以进行单步调试。

7.执行Dockerfile中的所有指令并生成一个新的镜像。

docker build -t="lunhui/nginx:v1" .

-t=“lunhui/nginx:v1”:指定了新生成镜像的镜像名称。
.:表示的是在当前目录下寻找Dockerfile文件。

# 指定git仓库来寻找Dockerfile文件。
docker build -t="lunhui/nginx:v1" git@github.com:wangzhe0912/docker_web

Ps:如果在构建目录中存在.dockerignore命令的文件时,那么该文件内容将会被按行分割,按行匹配过滤,类似于.gitignore文件。

8.构建缓存

Docker在构建过程中,会从在一定的缓存机制。
例如我们修改了Dockerfile的第五行后重新进行构建,那么构建过程中前四行将不会进行重复执行,而是直接从缓存中进行读取。
如果我们希望强制忽略缓存时,可以额外添加–no-cache参数进行设置。

sudo docker build --no-cache -t="lunhui/nginx:v1" .

基于构建缓存的Dockerfile模版
为了合理利用缓存机制,而又不需要手工添加命令强制清除缓存,那么可以借鉴如下模板:

FROM ubuntu:14.04
MAINTAINER lunhui "yezheyezhe@126.com"
ENV REFRESHED_AT 2018-01-28
RUN apt-get update
...

ENV:的作用是设置环境变量。而在此时,我们的目的是用于刷新构建和缓存,当ENV的值发生变化时,将会忽略后续的缓存,重新执行。而当ENV的值没有发生变化时,则可以充分利用缓存的机制快速构建。

查看新镜像

当构建完成后,我们就完成了一个新镜像的构建。
我们可以使用如下命令来查看该镜像的完整构建过程:

docker history image_name/id

从新镜像启动容器

下面,我们将使用刚才构建的镜像来详细了解一下nginx镜像该如何运行和使用。
下面我们以如下命令进行讲解:

docker run -d -p 80 --name lunhui_nginx lunhui/nginx:v1 nginx -g "daemon off;"

-d:表示以后台程序进行运行,
-p 80:用于指定在运行时公开80端口给宿主机。默认情况下,宿主机会在随机选择一个端口号映射到容器的80端口上。当然,我们也可以指定用宿主机的某个端口(例如8080)来映射到容器的80端口,使用方式如下:-p 8080:80。当然,还有一种更加简单的方式,之前我们在Dockerfile文件中指定了EXPOSE对应端口,我们可以直接使用-P来打开在Dockerfile文件中指定的端口。
–name lunhui_nginx:指定容器的名称
nginx -g “daemon off;”:表示了容器需要执行的命令。
运行完成后,我们需要查看一下我们的容器映射到了宿主机的哪个端口中。 可以执行命令docker ps来查看。

端口映射查询

docker port lunhui_nginx 80
0.0.0.0:32768

即指定容器名称和容器端口,可以直接查询映射的端口地址。
下面,我们来访问一下该地址,看下我们的nginx服务是否已经正常启动。

curl localhost:32768
Hi, I am your contrainer

9.Dockerfile指令

FROM, ENV, RUN, EXPOSE等

  1. CMD
    CMD是一个容器启动时要运行的命令。 例如,我们之前启动一个容器时的代码类似如下:
    docker run -it wangzhe0912/nginx /bin/bash
    其中,/bin/bash表示的是启动容器时需要执行的命令。 可以等效如下:
    CMD ["/bin/bash"] 此外,我们还可以给运行命令参数相关参数,例如:
    CMD ["/bin/bash", “-l”] PS:在启动容器时,可以通过docker
    run命令来覆盖CMD指令。还有在Dockerfile中只能指定一条CMD指令,如果指定多条,最后一条CMD指令将会生效。
  2. ENTRYPOINT
    ENTRYPOINT与CMD十分类似,相比较而言ENTRYPOINT更不容易被覆盖。 简单的说,我们通常会设置可执行文件在ENTRYPOINT中,而在CMD中设置需要传入的参数。
    因为通常而言,默认运行的可执行文件通常不会发生变化,但是参数变化则相对可能会频繁一些。 示例如下:
    ENTRYPOINT ["/usr/sbin/nginx"] CMD ["-h"] Ps:如果有需要,可以在docker
    run时,使用–entrypoint="***"来强制覆盖ENTRYPOINT。
  3. WORKDIR
    WORKDIR用于在容器内设置工作目录,ENTRYPOINT和CMD命令会在指定的目录下执行。 示例:
    WORKDIR /opt/webapp RUN bundle install WORKDIR /opt/webapp/db
    ENTRYPOINT [“rackup”] Ps:-w可以在运行时覆盖工作目录。 例如:
    docker run -it -w /var/log ubuntu pwd
  4. ENV
    在镜像构建过程中设置环境变量。新设置的环境变量可以在后续任何的RUN指令中使用。 示例:
    ENV RVM_PATH /home/rvm/ RUN gem install unicorn
    PS:在运行时可以使用-e来传递环境变量,示例:
    docker run -it -e “WEB_PORT=8080” pwd
  5. USER
    USER指令用于设定该镜像会以什么用户去执行。 默认会以root用户执行。可以在运行命令中使用-u进行覆盖。 示例:
    docker run -it -u “nginx” pwd
  6. VOLUMN
    VOLUMN用户指定向基于镜像创建的容器添加卷。
    卷是指可以存在于一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统来共享数据或者数据持久化。 以下是一些卷的特点:
    卷可以在容器中共享和重用。 对卷的修改是实时生效。 对卷的修改不会影响镜像。 卷会一直存在到没有容器使用他。
    卷功能可以将数据、代码、数据库等信息添加到镜像而不是把这些内容提交到镜像。 使用示例:
    VOLUMN ["/opt/project", “/data”]
  7. ADD ADD指令用于将构建环境下的文件和目录复制到镜像中。 常用的场景例如安装一个应用程序。
    ADD指令需要源文件和目的文件位置两个参数。 示例代码:
    ADD software.lic /opt/applicaion/software.lic
    Ps:ADD命令本身来有一些相对需要注意的点: ADD命令可以自动将一些压缩文件进行自动解压:
    ADD latest.tar.gz /var/www/wordpress/
    此外,如果目的文件夹不存在的话,Docker会自动帮助我们创建完整的路径。新创建的文件和目录的权限都是0755。
    还有一点是ADD指令会使之前的缓存全部失效。
  8. COPY COPY指令与ADD指令相类似,不过COPY只关注与复制文件,而不会做文件的提取和解压。
  9. ONBUILD
    ONBUILD指令可以为镜像添加触发器。 当一个镜像被其他镜像用作基础镜像时,该镜像的触发器会执行。 触发器可以是任何构建指令,通常是紧跟在FROM后面的。
    ONBUILD ADD . /app/src ONBUILD RUN cd /app/src && make

将镜像推送至Docker Hub

sudo docker push wangzhe0912/nginx

自动构建

除了我们通过命令行构建后推送镜像之外,Docker Hub本身来支持自动构建。
自动构建只需要我们将Github中含有Dockerfile文件的仓库连接到Docker Hub即可。
每次推送代码后,会自动触发构建一个新的镜像。

删除镜像

docker rmi 镜像名称

只会删除本地的镜像,在Docker Hub中的镜像不会自动删除。

搭建自己的Dockers Registry

docker run -d -p 5000:5000 registry

使用本地的registry为我们想要推送的镜像打好标签。

docker tag 镜像id 127.0.0.1:5000/wangzhe0912/nginx

推送

docker push 127.0.0.1:5000/wangzhe0912/nginx