学习了《第一本docker书》后写下的笔记,方便以后查看
Docker仅在linux内核3.08及以上版本运行,使用uname -a
检查当前linux系统内核版本
ubuntu安装教程可参考这篇文章
centos7可参考这篇文章
使用下面这个命令检查是否安装成果
sudo docker info
echo "{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}" >> /etc/docker/daemon.json
将该命令执行可以更换docker镜像源,提高pull速度
sudo docker search [image]
添加
--limit n
限制显示条目为n条
比如输入sudo docker search ubuntu
[root@localhost ~]# docker search ubuntu
#名称([用户名/]仓库名) 描述 星数(好评数) 是否官方提供 是否自动构建
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 13629 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 605 [OK]
.......
打开Docker Hub,搜索想查找的仓库,点开Tag页面便可看到该仓库源的所有TAG
我知道的目前只有这样子了
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
参数:
例如拉取ubuntu:16.10
,:
后面的内容代表版本,也称为标签,不写的话默认会是latest
,代表最新版本
sudo docker pull ubuntu:16.10
sudo docker images [OPTIONS] [REPOSITORY[:TAG]]
使用-q
参数让该命令只输出镜像id
docker rmi [OPTIONS] IMAGE [IMAGE...]
使用-f
强制删除镜像
若想要删除所有镜像,可使用
sudo docker rmi `docker images -q`
使用如下命令运行一个容器
sudo docker run [options] [image:tag] [command]
image[:tag]
代表想要运行的镜像名 command
代表启动容器后要运行的命令
若本地没有所需镜像,docker会自动从docker hub上拉取
常用参数有
-t 为该容器分配一个伪终端(tty),与-i
搭配使用
-i 保持该容器的标准输入stdin打开,与-t搭配使用
-d 使该容器在后台运行,并返回一个容器id
–name 为容器分配一个名称,不指定本参数docker将会随机生成一个
-p 指定端口转发
-P 将容器内部开放的所有端口随机分配到主机端口
内部开放指构建时Dockerfile文件中EXPOSE的所有端口
启动一个Ubuntu16.10容器命名为hello并进入
[root@localhost ~]# docker run -it --name hello ubuntu:16.10 /bin/bash
root@c8e790d88ca0:/#
可以看到主机名变成了容器idc8e790d88ca0
执行命令后进入容器终端,
exit
退出终端后容器也会随之停止
启动一个nginx容器开放80端口并后台运行
sudo docker run -d --name static_web -p 80 nginx /bin/sh -c 'nginx daemon off;'
通过在启动容器时添加--restart
参数使容器停止时自动重启,--restart=always
会让容器停止时始终自动重启,--restart=on-failure:5
可让容器退出码非0时重启至多5次
容器执行完命令后,将会自动停止,如果我们想再次启动,可以使用下面的命令重启:
sudo docker start [OPTIONS] CONTAINER [CONTAINER...]
重启时的容器会再次执行docker run
中使用的命令,对hello容器而言就是/bin/bash
若想要重启后进入容器,可添加-a
参数进入容器的命令提示符
容器重启后,并不会直接进入容器,需要执行额外命令进入容器
sudo docker attach [OPTIONS] CONTAINER
同样的,在退出容器shell后,容器将会停止
如何进入容器终端并退出容器后不让容器停止呢
我们可以使用exec命令让指定容器执行命令:
sudo docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
该命令与docker run
具有类似用法,使用docker exec -it CONTAINER /bin/bash
进入容器命令提示符,也可添加-d
参数来后台执行命令
通过该命令进入容器的shell退出后,容器并不会停止,因此,更推荐用这个命令进入容器
若想要查看容器输出了什么东西,或者容器异常停止,想要查看报错信息:
sudo docker logs [OPTIONS] CONTAINER
参数:
tail -f
tail
命令可以通过sudo docker exec -it CONTAINER /bin/bash
进入容器后使用top
之类的程序查看容器进程,也可以:
sudo docker top CONTAINER
获取容器的更多配置信息:
sudo docker inspect [OPTIONS] NAME|ID [NAME|ID...]
执行以下命令显示正在运行的命令
sudo docker ps [OPTIONS]
参数:
[root@localhost ~]# docker ps
#容器id 使用的镜像 启动命令 创建时间 当前状态 映射端口 名字
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8e790d88ca0 ubuntu:16.10 "/bin/bash" 3 hours ago Up 24 seconds hello
docker stop [OPTIONS] CONTAINER [CONTAINER...]
参数:-t
发送停止命令后等待的最大秒数,默认为10秒
想要删除容器时:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
参数:
删除所有容器:
sudo docker rm `docker ps -aq`
Docker Hub:https://hub.docker.com/
注册docker hub 后,使用如下命令登录
sudo docker login
当我们对容器做出修改,想要打包上传修改好的镜像时,可以使用(不推荐)
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数:
例如,用sudo docker commit hello yuy/hello
将hello容器上传到yuy用户下的hello仓库中,且当前TAG为latest
docker build [OPTIONS] PATH | URL | -
常用参数: -t
: 给构建的镜像一个名字和TAG 格式为 [AUTHOR/]NAME:TAG
新建一个目录,记为工作目录,进去新建一个文件,名为Dockerfile
[root@localhost doc]# mkdir static__web
[root@localhost doc]# cd static__web/
[root@localhost static__web]# touch Dockerfile
编辑Dockerfile
FROM ubuntu:14.04
MAINTAINER imshixin "[email protected]"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "HI,Iam in your container"> /usr/share/nginx/html/index.html
EXPOSE 80
文件写好后保存,在当前目录下执行命令:
sudo docker build -t imshixin/static__web .
[root@localhost static__web]# docker build -t imshixin/static__web .
Sending build context to Docker daemon 2.048kB
Step 1/6 : FROM ubuntu:14.04
---> 13b66b487594
Step 2/6 : MAINTAINER imshixin "[email protected]"
---> Running in 82f37e087a04
Removing intermediate container 82f37e087a04
---> 06a2474f3b21
Step 3/6 : RUN apt-get update
---> Running in 347a2af628a6
..................
Removing intermediate container 347a2af628a6
---> b57319d185a8
Step 4/6 : RUN apt-get install -yq nginx
---> Running in c32f24d86396
................
Removing intermediate container c32f24d86396
---> 1f4158f33caa
Step 5/6 : RUN echo "HI..." >>/usr/share/nginx/html/index.html
---> Running in 18fa23d03804
Removing intermediate container 18fa23d03804
---> 07f321aed70e
Step 6/6 : EXPOSE 80
---> Running in 2b189d5fef76
Removing intermediate container 2b189d5fef76
---> 0ad1c8959552
Successfully built 0ad1c8959552
Successfully tagged imshixin/static__web:latest
观察上面的输出,每一步命令后面都输出了一个镜像id,若在某一步命令执行失败,我们可以用上一步输出的镜像id执行docker run
命令,进入容器,调试错误原因。改正后再次执行docker build
。
Docker会将构建成功的每一步镜像缓存,在Dockerfile中的某一行做出修改后,其前面的命令可以直接使用构建缓存中的镜像
各命令解释,Docker大致按如下流程执行
FROM
指定一个基础镜像,docker 生成一个此镜像的容器
MAINTAINER
构建镜像的拥有者以及邮箱
RUN
在上一步生成的容器中执行shell命令,执行成功后会将该容器打包成镜像(类似docker commit
),并用该镜像运行新的容器供后面使用,一般有两种写法
RUN COMMAND
RUN [COMMAND,...]
EXPOSE
期望暴露的端口,需要在docker run -p
时指定要暴露的端口才会真正暴露,docker run -P
将会把dockerfile中所有期望暴露的端口随机绑定到主机
*CMD COMMAND
容器启动(docker run
)时执行的命令,如果定义了多个CMD命令仅最后一个生效。也可以为ENTRYPOINT
提供参数,支持与RUN
命令相同的两种写法
该命令仅在启动容器时执行,也会被
docker run
指定的命令覆盖
*ENTRYPOINT [COMMAND,...]
类似于CMD
,容器启动时运行,且仅最后一个ENTRYPOINT
生效,但不同的是,它不会被docker run
指定的指令所覆盖,除非存在--entrypoint COMMAND
参数。除此之外,docker run
命令的COMMAND
指令或CMD
命令的参数将会传递到ENTRYPOINT
指令上
例如,Dockerfile内容:
...... CMD "/etc/nginx/nginx.conf" ENTRYPOINT ["nginx","-c"]
不传参启动容器:
docker run -d IMAGE
执行结果:
nginx -c "/etc/nginx/nginx.conf"
传参启动容器:
docker run -d IMAGE /etc/nginx/other.conf
传参执行结果:
nginx -c "/etc/nginx/other.conf"
USER
指定后续指令执行的用户和用户 组,格式有USER user
,USER user:group
,USER uid
,USER uid:gid
*WORKDIR
切换当前执行的工作目录,类似于shell的cd
*ENV key value
| ENV key1=value1 key2=value2 ...
设置环境变量以供后面的指令使用,在构建过程中和用该镜像启动的所有容器生效
ARG
与ENV
类似,但是它定义的环境变量只能在构建过程种使用
ADD
格式为ADD 源文件 目标文件路径
将主机上的源文件添加到镜像的指定路径中 ,目标文件路径可以只写目录地址而不写文件名,不存在的路径将会自动创建,新创建的目录权限为0755 ,UID和GID均为0
注意,
ADD
命令会自动将本地归档文件(包括gzip
,gzip2
,xz
)解压,例如ADD latest.tar.gz /var/www/wordpress
会把latest.tar.gz解压到wordpress命令ADD命令会使后面所有命令的构建缓存失效
*COPY
与ADD命令类似,但是它不会自动解压缩文件
构建后的镜像可通过docker images
查看到,如果我们想将镜像上传到docker hub:
sudo docker push username/IAMGE
username是我们在dockerhub 上注册的用户名,docker将会把镜像上传到我们账号下面的仓库中去