0%

Docker入门学习


title: “Docker入门”
author:
- imshixin
keywords: [Docker]
abstract: “docker入门”

[toc]

Docker安装

Docker仅在linux内核3.08及以上版本运行,使用uname -a检查当前linux系统内核版本

ubuntu安装教程可参考这篇文章

centos7可参考这篇文章

使用下面这个命令检查是否安装成果

1
sudo docker info

替换默认镜像源

1
echo "{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}" >> /etc/docker/daemon.json

将该命令执行可以更换docker镜像源,提高pull速度

Docker 镜像操作

搜索镜像

1
sudo docker search [image]

添加--limit n限制显示条目为n条

比如输入sudo docker search ubuntu

1
2
3
4
5
6
[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

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

下载镜像

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

参数:

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

例如拉取ubuntu:16.10,:后面的内容代表版本,也称为标签,不写的话默认会是latest,代表最新版本

1
sudo docker pull ubuntu:16.10

查看下载的镜像

1
sudo docker images [OPTIONS] [REPOSITORY[:TAG]]

使用-q参数让该命令只输出镜像id

删除镜像

1
docker rmi [OPTIONS] IMAGE [IMAGE...]

使用-f强制删除镜像

若想要删除所有镜像,可使用

1
sudo docker rmi `docker images -q`

Docker容器使用

启动一个容器

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

1
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并进入

1
2
3
[root@localhost ~]# docker run -it --name hello ubuntu:16.10 /bin/bash
root@c8e790d88ca0:/#

可以看到主机名变成了容器idc8e790d88ca0

执行命令后进入容器终端,exit退出终端后容器也会随之停止

启动一个nginx容器开放80端口并后台运行

1
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次

重启并进入容器

容器执行完命令后,将会自动停止,如果我们想再次启动,可以使用下面的命令重启:

1
sudo docker start [OPTIONS] CONTAINER [CONTAINER...]

重启时的容器会再次执行docker run中使用的命令,对hello容器而言就是/bin/bash

若想要重启后进入容器,可添加-a参数进入容器的命令提示符

附加到容器

容器重启后,并不会直接进入容器,需要执行额外命令进入容器

1
sudo docker attach [OPTIONS] CONTAINER

同样的,在退出容器shell后,容器将会停止

如何进入容器终端并退出容器后不让容器停止呢

执行容器命令

我们可以使用exec命令让指定容器执行命令:

1
sudo docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

该命令与docker run具有类似用法,使用docker exec -it CONTAINER /bin/bash进入容器命令提示符,也可添加-d参数来后台执行命令

通过该命令进入容器的shell退出后,容器并不会停止,因此,更推荐用这个命令进入容器

打印容器的输出

若想要查看容器输出了什么东西,或者容器异常停止,想要查看报错信息:

1
sudo docker logs [OPTIONS] CONTAINER

参数:

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

查看容器内的进程

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

1
sudo docker top CONTAINER

打印容器信息

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

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

Docker容器管理

查看正在运行的容器

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

1
sudo docker ps [OPTIONS]

参数:

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

停止正在运行的容器

1
docker stop [OPTIONS] CONTAINER [CONTAINER...]

参数:-t 发送停止命令后等待的最大秒数,默认为10秒

删除已停止的容器

想要删除容器时:

1
docker rm [OPTIONS] CONTAINER [CONTAINER...]

参数:

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

删除所有容器:

1
sudo docker rm `docker ps -aq`

DockerHub以及镜像构建

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

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

1
sudo docker login

构建并上传镜像

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

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

参数:

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

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

用Dockerfile构建镜像

新建一个目录,记为工作目录,进去新建一个文件,名为Dockerfile

1
2
3
[root@localhost doc]# mkdir static__web
[root@localhost doc]# cd static__web/
[root@localhost static__web]# touch Dockerfile

编辑这个文件

1
2
3
4
5
6
FROM ubuntu:16.10
MAINTAINER imshixin "imsixn@163.com"
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

各命令解释,Docker大致按如下流程执行

FROM 指定一个基础镜像,docker 生成一个此镜像的容器

MAINTAINER 此镜像的拥有者以及邮箱

RUN 在上一步生成的容器中执行RUN后面命令,并生成一个镜像,用该镜像运行新的容器,指令将会用/bin/sh -c包裹,使用RUN ["apt-get","install","-y","nginx"]将不会用shell包裹,因此RUN有两种写法

  • RUN COMMAND
  • RUN [COMMAND,...]

EXPOSE 期望暴露的端口,需要在docker run -p时指定要暴露的端口才会真正暴露,docker run -P将会把dockerfile中所有期望暴露的端口随机绑定到主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[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 "imsixn@163.com"
---> 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

欢迎关注我的其它发布渠道