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。
镜像分为两个类别:
- Docker用户自己创建的用户仓库,完整名称是由用户名称/仓库名称组成的。
- Docker官方维护的顶层仓库。没有用户名称,直接是仓库名称。
仓库完整格式如下:
[用户名称/]仓库名称:tag。
在使用docker run从一个镜像启动容器时,Docker首先会现在本地查找是否存在该镜像。如果在本地没有找到该镜像,则会先从Dockers Hub上下载该镜像后在运行。如之前所说,如果没有指定tag,则默认使用latest标签。
3.查找镜像
sudo docker search 关键字
4.构建镜像
构建镜像的方式有以下两种:
- 使用docker commit构建
- 使用docker build和Dockerfile文件来构建(推荐)
(一般来说,我们并非从零开始构建一个镜像,而是从一个base镜像开始修改构建的。)
创建docker hub账号 https://hub.docker.com/ 。
通过命令行在本地绑定对应的Docker Hub账号。
sudo docker login
通过docker commit来修改镜像
流程简介如下:
- 根据某个镜像创建一个容器
- 对该容器进行一些修改
- 提交该容器并生成一个新的镜像。
示例:
# 根据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指令中指定需要打开的端口。
运行过程中的机制:
- 首先从基础镜像ubuntu:14.04中启动一个容器
- 执行一条run指令
- 执行类似commit指令,提交一个新的镜像层。
- 基于步骤3提交的镜像运行一个新的容器。
- 返回步骤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等
- 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指令将会生效。 - ENTRYPOINT
ENTRYPOINT与CMD十分类似,相比较而言ENTRYPOINT更不容易被覆盖。 简单的说,我们通常会设置可执行文件在ENTRYPOINT中,而在CMD中设置需要传入的参数。
因为通常而言,默认运行的可执行文件通常不会发生变化,但是参数变化则相对可能会频繁一些。 示例如下:
ENTRYPOINT ["/usr/sbin/nginx"] CMD ["-h"] Ps:如果有需要,可以在docker
run时,使用–entrypoint="***"来强制覆盖ENTRYPOINT。 - 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 - ENV
在镜像构建过程中设置环境变量。新设置的环境变量可以在后续任何的RUN指令中使用。 示例:
ENV RVM_PATH /home/rvm/ RUN gem install unicorn
PS:在运行时可以使用-e来传递环境变量,示例:
docker run -it -e “WEB_PORT=8080” pwd - USER
USER指令用于设定该镜像会以什么用户去执行。 默认会以root用户执行。可以在运行命令中使用-u进行覆盖。 示例:
docker run -it -u “nginx” pwd - VOLUMN
VOLUMN用户指定向基于镜像创建的容器添加卷。
卷是指可以存在于一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统来共享数据或者数据持久化。 以下是一些卷的特点:
卷可以在容器中共享和重用。 对卷的修改是实时生效。 对卷的修改不会影响镜像。 卷会一直存在到没有容器使用他。
卷功能可以将数据、代码、数据库等信息添加到镜像而不是把这些内容提交到镜像。 使用示例:
VOLUMN ["/opt/project", “/data”] - ADD ADD指令用于将构建环境下的文件和目录复制到镜像中。 常用的场景例如安装一个应用程序。
ADD指令需要源文件和目的文件位置两个参数。 示例代码:
ADD software.lic /opt/applicaion/software.lic
Ps:ADD命令本身来有一些相对需要注意的点: ADD命令可以自动将一些压缩文件进行自动解压:
ADD latest.tar.gz /var/www/wordpress/
此外,如果目的文件夹不存在的话,Docker会自动帮助我们创建完整的路径。新创建的文件和目录的权限都是0755。
还有一点是ADD指令会使之前的缓存全部失效。 - COPY COPY指令与ADD指令相类似,不过COPY只关注与复制文件,而不会做文件的提取和解压。
- 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