docker基本用法

docker基本操作

查看docker概要

docker info

查看docker帮助文档

docker -help

查看docker状态

systemctl status docker

启动docker

systemctl start docker

关闭docker

systemctl stop docker

重启docker

systemctl restart docker

docker镜像操作

查看镜像列表

docker images

搜索镜像

docker search 镜像名称

配置docker镜像加速器

拉取镜像 默认是从 Docker Hub 镜像仓库上进行获取的,即 https://hub.docker.com/, 由于国内无法拉取或者会非常慢,我们可以修改拉取地址为一些国内的镜像。
关于拉取地址的配置在:etc/docker/daemon.json

我们修改其即可

{ 
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}

docker镜像拉取、删除

拉取镜像

docker pull 镜像名称

删除镜像

docker rmi 镜像ID

删除所有镜像

docker rmi `docker images -q`

docker容器操作

查看容器

查看正在运行的容器

docker ps

查看所有容器(包含正在运行的容器以及之前启动过的容器)

docker ps -a

查看最后一次运行的容器

docker ps -l

查看停止的容器

docker ps -f status=exited

容器创建

创建交互式容器:当退出容器(如输入Ctrl + C 或 exit)时,容器就关闭了。

docker run -it --name=容器名称 镜像名称

如果需要做端口映射(比如将宿主机的某个端口映射到容器中的某个端口上),则要加上-p参数。

docker run -it --name=容器名称 -p 8888:8080 镜像名称

如果要映射多个端口,则加上多个-p参数即可,如:

docker run -it --name=容器名称 -p 8888:8080 -p 1080:1080 镜像名称

创建守护式容器:当退出容器(如输入Ctrl + C 或 exit)时,容器依然处于运行状态。

docker run -id --name=容器名称 -p 8888:8080 镜像名称

在创建完守护式容器后,并未直接进入到容器中,所以需要再输入下面的命令来进入容器内。

docker exec -it 容器名称 /bin/bash

容器启动

docker start 容器名称/容器ID

容器停止

docker stop 容器名称/容器ID

容器删除

删除单个容器

docker rm 容器名称/容器ID

删除所有容器

docker rm `docker ps -a -q`

注意:只能删除已经关闭的容器

docker部署操作

docker文件拷贝

将需要放在docker容器内的文件拷贝到容器中,在宿主机命令行中输入:

docker cp 宿主机待拷贝的文件 容器名称:容器目录
如:docker cp ./test.txt ubuntu01:/home

docker目录挂载

在创建容器的时候,我们可以将宿主机的某个目录映射到容器内的目录,这样如果修改宿主机某个目录的文件内容,容器内对应的文件内容也会随之改变。

在创建容器时添加参数 --privileged=true

docker run -id -v 宿主机目录:容器目录 --name=容器名称 --privileged=true 镜像名称
如:docker run -id -v /home/test:/root/test --name=ubuntu01 --privileged=true ubuntu_image

docker备份

第一步:将容器保存为镜像

docker commit 容器名称 保存的新镜像名称

如需修改TAG,则输入以下命令,然后用docker images会发现有两个镜像ID一样但镜像名称不同的镜像。

docker tag 镜像ID 镜像名称:TAG名称

第二步:将镜像打包备份

docker save 镜像名称 -o 打包后的文件名称
如:docker save iamge_name -o ./pack_name.tar

将镜像打包后就可以进行迁移和部署了。

镜像加载/部署

docker load -i 镜像文件名称

推送自己的镜像

首先检查按照镜像仓库的规定修改镜像名称和镜像TAG:

docker tag 镜像ID 镜像名称:TAG名称
如:docker tag ba5877dc9bec 127.0.0.1:5000/ubuntu:v0.1

然后登录镜像仓库,根据提示输入用户名和密码:

docker login 镜像仓库IP

最后将自己的镜像push到镜像仓库:

docker push 镜像名称:镜像TAG

注意事项:

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

这是因为 docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制。

如果您的宿主机系统是Ubuntu、Debian、Centos等系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件),此处以 192.168.199.100:5000 为例:

{
"registry-mirror": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.199.100:5000"
]
}

然后输入systemctl restart docker重启docker。

对于Windows、MacOS系统,则可在Docker for Windows 、Docker for Mac客户端软件的设置中编辑 daemon.json文件, 增加和上述一样的仓库地址即可。

Dockerfile的基本用法

Dockerfile文件格式说明

1、Dockerfile整体就两类语句组成:

  • # Comment 注释信息
  • Instruction arguments 指令 参数,一行一个指令。

2、Dockerfile文件名首字母必须大写。

3、Dockerfile指令不区分大小写,但是为方便和参数做区分,通常指令使用大写字母。

4、Dockerfile中指令按顺序从上至下依次执行。

5、Dockerfile中第一个非注释行必须是FROM指令,用来指定制作当前镜像依据的是哪个基础镜像。

6、Dockerfile中需要调用的文件必须跟Dockerfile文件在同一目录下,或者在其子目录下,父目录或者其它路径无效。

用Dockerfile构建镜像

$ docker build -t 镜像名称:TAG名称 .

命令说明:

  • build -t 指定通过Dockerfile来创建镜像
  • . 表示在当前路径寻找Dockerfile文件

创建完成后,可用docker images查看新创建的镜像。

运行镜像

$ docker run -id --name=容器名称 -p 8888:8080 镜像名称:镜像TAG
$ docker exec -it 容器名称 /bin/bash

注:此时是将宿主机的 8888 端口映射到容器中的 8080 端口上。如果是临时测试,可以在运行容器时加上--rm参数,这样在退出容器以后,容器就被自动删除了。如果不加--rm ,则退出容器后,容器只是停止运行,而数据依然被保留。

更多关于Dockerfile的详细介绍,请参考链接:https://www.cnblogs.com/ccbloom/p/11174186.html,这里写的非常详细。

Docker Compose基本用法

Docker Compose是一个定义和运行多容器应用的单机编排工具。通过Docker Compose你可以使用一个单一的YAML文件来配置多个应用服务,通过一条命令,就可以将所有配置的服务全部启动起来。

在介绍docker compose之前,我们先简单了解下YAML文件:

YAML(Yet Another Markup Language)(发音 /ˈjæməl/ )是一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达资料序列的编程语言。

yml的基本语法

1、yml文件以缩进代表层级关系

2、缩进不允许使用tab,只能使用空格

3、空格的个数不重要,只要相同层级的元素左对齐即可

4、大小写敏感

5、数据格式为,名称:(空格)值

6、‘#’表示注释,且只能单行注释,注释内容是从#开始处到行尾

7、破折号后面跟一个空格(a dash and space)表示列表。

yml支持的数据格式

1、对象:键值对的集合(key:value)

  • 字符串不用使用双引号或单引号圈起来
  • 双引号圈住时不会转义字符串中的特殊字符
  • 单引号圈住时会转义字符串中的特殊字符

2、数组:一组按顺序排列的值

多行写法

数组名:

​ - 元素1

​ - 元素2

​ - 元素3

单行写法:

数组名: [元素1,元素2,元素3]

3、字面量:单个的、不可再分的值(数字、字符串、布尔值)

以上内容的参考链接:

关于docker compose的用法,在网上有很多的介绍,具体可以参考这个:https://www.cnblogs.com/breezey/p/9426085.html

这里只简单介绍下常用的一些命令以及我自己在使用过程中的一些经验。

docker-compose 常用命令

说明:docker-compose命令必须在 docker-compose.yml 文件所在目录下执行才有效

有两种方式可以有效运行docker-compose命令

1、在docker-compose.yml文件所在目录下执行docker-compose命令:

docker-compose up    ##前台运行

docker-compose up -d ##后台运行

2、使用 -f 参数指定compose文件,例如:

docker-compose -f /opt/test-compose.yml up    ##前台运行

docker-compose -f /opt/test-compose.yml up -d ##后台运行
命令 说明
docker-compose up -d 构建并启动所有容器
docker-compose up -d --build 在dockerfile更新后,会自动更新image
docker-compose up -d nginx 构建并启动nignx容器
docker-compose exec nginx bash 登录到nginx容器中
docker-compose down 删除所有容器,镜像
docker-compose ps 显示所有容器
docker-compose restart nginx 重启nginx容器
docker-compose run nginx ping www.baidu.com 在nginx容器上执行ping命令
docker-compose build nginx 构建nginx镜像
docker-compose build –no-cache nginx 构建nginx镜像过程中不使用缓存
docker-compose logs nginx 查看nginx容器的日志
docker-compose logs -f nginx 查看nginx容器的实时日志
docker-compose config -q 验证(docker-compose.yml)文件配置。
配置正确时,不输出任何内容;
文件配置错误,输出错误信息。
docker-compose pause nginx 暂停nginx容器
docker-compose unpause nginx 恢复nginx容器
docker-compose rm nginx 删除容器(删除前必须关闭容器)
docker-compose stop nginx 停止nignx容器
docker-compose start nginx 启动nignx容器

参考链接:

docker-compose.yml配置文件说明

其实网上有很多关于配置文件的说明,这里就不再做详细介绍。这里介绍一下docker-compose如何通过文件来声明默认的docker容器环境变量。

Docker Compose支持使用声明默认环境变量的.env文件启动,这个文件的位置需要与 docker-compose.yml 同级目录。我们只需要在同级目录下创建.env文件来指定默认的环境变量,这些变量可以部分或完整作为配置的内容,大大简化我们的配置,以及一处修改多处生效的目的。

语法规则
  • .env文件中的每一行都是KEY=VAL格式
  • #开头的内容将被注释
  • 忽略空白行
  • .env中的KEY可以在docker-compose.yml中作为某个VAL的一部分
测试

这里拿个nginx做测试吧,我们最后使用docker-compose config进行查看当前环境生效的配置。

1、新建并进入目录test,创建docker-compose.yml文件

$ mkdir test
$ cd test
$ vim docker-compose.yml

2、往docker-compose.yml文件中写入如下内容:

version: "3"
services:
mynginx:
image: nginx:${TAG}
ports:
- 80:80

3、如果我们此时直接启动docker-compose config 我们会得到如下输出:

$ docker-compose config
WARNING: The TAG variable is not set. Defaulting to a blank string.
services:
mynginx:
image: 'nginx:'
ports:
- 80:80/tcp
version: '3.0'

如你所见,由于引用的变量TAG不存在,而被当成空字符串进行赋值。

4、创建.env文件并在文件中添加如下内容:

# .env the default environment config file
TAG=1.7.9

5、再次启动docker-compose config

$ docker-compose config
services:
mynginx:
image: nginx:1.7.9
ports:
- 80:80/tcp
version: '3.0'

此时会发现变量TAG被.env文件中的字符串赋值。

注意:这个默认的环境变量配置的优先级略低,如果是从docker-compose run命令中传入相同的KEY,则yml配置文件中的值会被覆盖。

参考链接:

实战经验

目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。Alpine 操作系统是一个面向安全的轻型 Linux 发行版。Alpine 提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。

Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。

拉取Alpine基础镜像

docker pull alpine

进入Alpine Docker容器

如果使用之前提到的进入ubuntu docker容器的方式:

docker exec -it 容器名称 /bin/bash

会遇到下面类似的报错:

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

这是因为Alpine中没有bash。所以需要这样登录:

docker exec -it 容器名称 sh

在Alpine中安装软件包

apk add --no-cache <package>

如何清除docker镜像列表中带有<none>:<none>的镜像

我们在构建过Docker镜像的电脑上查看本地镜像列表,有可能看到下图红框中的镜像,即在列表中展示为<none>:<none>,如下图所示:

这种镜像在Docker官方文档中被称作dangling images,指的是没有标签并且没有被容器使用的镜像。

下面我们来简单梳理下dangling images是怎么产生的,结合上面那张图来看:

1、第一次构建镜像时生成的镜像ID为079dbd67f9f4,此镜像会被构建工具加上标签bolingcavalry/eureka-server:0.0.1-SNAPSHOT;
2、第二次构建镜像时生成的镜像ID为e40a97f764ef,此镜像会被构建工具加上标签bolingcavalry/eureka-server:0.0.1-SNAPSHOT,
3、此时Docker会自动移除079dbd67f9f4的标签,那么这时候079dbd67f9f4就变成了dangling images,即在镜像列表中展示为<none>:<none>。

dangling images产生的愿意我们已经知道了,那么我们该如何清理它们呢?

执行命令docker image prune即可批量删除dangling images。

刚才我们说满足dangling images需要两个条件:没有标签、且不再被容器使用,那么如果一个镜像没有标签,但仍在被容器使用,此时用 prune 命令会把它删除吗?

答案是,不会把它删除的。docker image prune是用来清理dangling images的,如果某个镜像正在被使用,那就不算是dangling images,也就不会被prune清理掉。