docker入门学习简易笔记

学习了《第一本docker书》后写下的笔记,方便以后查看

文章目录

    • Docker安装
        • 替换默认镜像源
    • Docker 镜像操作
      • 搜索镜像
      • 查看镜像的不同TAG
      • 下载镜像
      • 查看下载的镜像
      • 删除镜像
    • Docker容器使用
      • 启动一个容器
        • 让容器自动重启
      • 重启并进入容器
      • 附加到容器
      • 执行容器命令
      • 打印容器的输出
      • 查看容器内的进程
      • 打印容器信息
    • Docker容器管理
      • 查看正在运行的容器
      • 停止正在运行的容器
      • 删除已停止的容器
    • DockerHub以及镜像构建
      • 构建并上传镜像
      • 用Dockerfile构建镜像
        • 示例
        • 构建缓存与错误调试
        • Dockerfile命令
      • 将镜像推送到Docker Hub

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速度

Docker 镜像操作

搜索镜像

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]
.......

查看镜像的不同TAG

打开Docker Hub,搜索想查找的仓库,点开Tag页面便可看到该仓库源的所有TAG

我知道的目前只有这样子了

下载镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

参数:

  • -a 下载该仓库的所有镜像(原文:Download all tagged images in the repository)
  • -q 静默下载

例如拉取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`

Docker容器使用

启动一个容器

使用如下命令运行一个容器

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 80 将容器的80端口随机绑定(映射)到主机端口
    • -p 8080:80 将容器的80端口映射到主机的8080端口
    • -p ip:hostPort 将容器的端口绑定到主机指定的ip和一个随机端口
    • -p ip:hostPort:conPort 将容器conPort绑定的主机的ip:hostPort
  • -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

参数:

  • -f 持续性的输出容器内容,类似tail -f
  • -n 仅输出最后n行内容,类似tail命令
  • -t 显示时间戳

查看容器内的进程

可以通过sudo docker exec -it CONTAINER /bin/bash进入容器后使用top之类的程序查看容器进程,也可以:

sudo docker top CONTAINER

打印容器信息

获取容器的更多配置信息:

sudo docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Docker容器管理

查看正在运行的容器

执行以下命令显示正在运行的命令

sudo docker ps [OPTIONS]

参数:

  • -a 显示所有容器,包括已停止的容器
  • -l 仅显示最近创建的容器
  • -q 仅输出容器的id
  • -s 显示容器文件大小
[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...]

参数:

  • -f 强制删除一个正在运行的容器
  • -l 移除特殊链接
  • -v 移除任何相关联的卷

删除所有容器:

sudo docker rm `docker ps -aq`

DockerHub以及镜像构建

Docker Hub:https://hub.docker.com/

注册docker hub 后,使用如下命令登录

sudo docker login

构建并上传镜像

当我们对容器做出修改,想要打包上传修改好的镜像时,可以使用(不推荐)

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数:

  • -a 作者
  • -m 修改信息
  • -p [true|false] 上传时暂定容器(默认为true)

例如,用sudo docker commit hello yuy/hello将hello容器上传到yuy用户下的hello仓库中,且当前TAG为latest

用Dockerfile构建镜像

 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中的某一行做出修改后,其前面的命令可以直接使用构建缓存中的镜像

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 ... 设置环境变量以供后面的指令使用,在构建过程中和用该镜像启动的所有容器生效

ARGENV类似,但是它定义的环境变量只能在构建过程种使用

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 Hub

构建后的镜像可通过docker images查看到,如果我们想将镜像上传到docker hub:

sudo docker push username/IAMGE

username是我们在dockerhub 上注册的用户名,docker将会把镜像上传到我们账号下面的仓库中去

你可能感兴趣的:(docker,学习,容器)