docker学习总结

清泓
2022-05-12 / 0 评论 / 3,896 阅读 / 10885字 / 正在检测是否收录...

docker的安装与卸载

我在学习过程中使用了Ubuntu和CentOS7安装docker,安装命令如下:

Ubuntu

 docker可以使用多种方式安装,这里只记录较为方便的官方自动安装脚本的方式

使用官方自动安装脚本

 使用官方自动安装脚本是最简单的一种安装方式了,可以避免一些问题的出现
命令行输入:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
如果出现命令未找到,那可能是没有安装curl,在命令行中输入apt-get install -y curl进行安装之后,在输入上述命令即可;如果是权限不足,则在命令前使用sudo提权

卸载

删除安装包
sudo apt-get purge docker-ce
删除镜像、容器、配置文件等内容
sudo rm -rf /var/lib/docker

CentOS

 CentOS安装docker与Ubuntu差别不大

官方自动安装脚本

命令行输入:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

卸载

删除安装包
sudo apt-get purge docker-ce
删除镜像、容器、配置文件等内容
sudo rm -rf /var/lib/docker

docker的使用

docker配置镜像源站

 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

只需要使用vim编辑修改/etc/docker/daemon.json配置文件
加入以下内容

{
  "registry-mirrors": ["加速地址"]
}

即可更换镜像源站,开启镜像加速


docker镜像使用

 运行容器时,如果使用的镜像在本地不存在,那么就会从docker镜像仓库中下载,如果没有配置镜像源站,默认是从Docker Hub公共镜像源进行下载

下面列出常用的操作镜像的命令

列出本地仓库镜像

 docker images

1.png

相关项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一个仓库源会有多个TAG,用来代表这个镜像的不同版本,就以mysql为例,mysql仓库源里会有5.7、8.2等不同版本,所以使用了REPOSITORY来标识镜像,TAG标识版本

如果不指定镜像TAG,则默认从仓库中拉取最后一个版本的镜像,同样以mysql为例,不指定TAG,则拉取的mysql为mysql:latest

拉取镜像

 使用镜像创建容器时,如果镜像不存在会从仓库源中拉取,而我们也可以主动从仓库源中拉取镜像,这时就需要使用docker pull命令了

docker pull

2.png

搜索镜像

 直接在各个镜像源站搜索镜像的方式就不用多说了,这里记录一下使用docker search命令的方式搜索镜像。比如说,我需要一个httpd的镜像,那就可以使用docker search命令
具体命令如下:

[root@GokouLuli999 ~]# docker search httpd

3.png

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否docker官方发布
  • stars: 类似Github里的 star,表示点赞
  • AUTOMATED: 自动构建。

删除镜像

镜像的删除比较简单,镜像删除使用 docker rmi 命令,比如删除 hello-world 镜像:

docker rmi hello-world

4.png


创建镜像

当 docker 镜像仓库中下载的镜像不能满足我们的需求时,可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像
  2. 使用 Dockerfile 指令来创建一个新的镜像
更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。
举例:

[root@Gokoululi999 ~]# docker run -it ubuntu:15.10 /bin/bash

参数说明:

  • -i: 交互式操作
  • -t: 终端
  • ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
    如果不指定镜像的版本标签,例如使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本

[root@Gokoululi999 ~]# docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各个参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2: 指定要创建的目标镜像名

可以使用 docker images 命令来查看新镜像 runoob/ubuntu:v2:

5.png

使用新镜像 runoob/ubuntu 来启动一个容器

[root@Gokoululi999 ~]# docker run -t -i runoob/ubuntu:v2 /bin/bash    
构建镜像

使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

[root@Gokoululi999 ~]# cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

[root@Gokoululi999 ~]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
 ---> Using cache
 ---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Using cache
 ---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
6.png
可以使用新的镜像来创建容器

[root@Gokoululi999 ~]# docker run -t -i runoob/centos:6.7  /bin/bash
[root@Gokoululi999 ~]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)

从上面看到新镜像已经包含我们创建的用户 runoob。


设置镜像标签

可以使用 docker tag 命令,为镜像添加一个新的标签

[root@Gokoululi999 ~]# docker tag 860c279d2fec runoob/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
7.png


docker容器使用

我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。


获取镜像

如果我们本地没有 ubuntu 镜像,可以使用 docker pull 命令来载入 ubuntu 镜像

docker pull ubuntu

启动容器

以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器

docker run -it ubuntu /bin/bash

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu: ubuntu 镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
    要退出终端,直接输入 exit
更多参数:

运行一个容器

docker run -it -p 8088:8088 -p 8089:8089 -p 8090:9090 -v /root/soft/docker:/root/soft/docker 
-v /root/soft/dockertt:/root/soft/dockertt loen/rc /bin/bash
命令的格式:

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • -a

    • --attach=[] 登录容器(以docker run -d启动的容器)
  • -c

    • --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
    • --cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
    • --cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
    • --cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
    • --cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
  • -d

    • --detach=false 指定容器运行于前台还是后台
    • --device=[] 添加主机设备给容器,相当于设备直通
    • --dns=[] 指定容器的dns服务器
    • --dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
  • -e

    • --env=[] 指定环境变量,容器中可以使用该环境变量
    • --entrypoint="" 覆盖image的入口点
    • --env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
    • --expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
  • -h

    • --hostname="" 指定容器的主机名
  • -i

    • --interactive=false 打开STDIN,用于控制台交互
    • --link=[] 指定容器间的关联,使用其他容器的IP、env等信息
    • --lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
  • -m

    • --memory="" 指定容器的内存上限
  • --name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
  • --net="bridge" 容器网络设置,待详述
  • -P

    • --publish-all=false 指定容器暴露的端口,待详述
  • -p

    • --publish=[] 指定容器暴露的端口,待详述
    • --privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
    • --restart="" 指定容器停止后的重启策略,待详述
    • --rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    • --sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
  • -t

    • --tty=false 分配tty设备,该可以支持终端登录
  • -u

    • --user="" 指定容器的用户
  • -v

    • --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
    • --volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
  • -w

    • --workdir="" 指定容器的工作目录
详细讲解

端口暴露

-P参数:docker自动映射暴露端口;

docker run -d -P training/webapp    //docker自动在host上打开49000到49900的端口,映射到容器(由镜像指定,或者--expose参数指定)的暴露端口

-p参数:指定端口或IP进行映射;

docker run -d -p 5000:80 training/webapp      //host上5000号端口,映射到容器暴露的80端口

docker run -d -p 127.0.0.1:5000:80 training/webapp      //host上127.0.0.1:5000号端口,映射到容器暴露的80端口

docker run -d -p 127.0.0.1::5000 training/webapp      //host上127.0.0.1:随机端口,映射到容器暴露的80端口

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp      //绑定udp端口


网络配置

--net=bridge:    //使用docker daemon指定的网桥

--net=host:    //容器使用主机的网络

--net=container:NAME_or_ID:    //使用其他容器的网路,共享IP和PORT等网络资源

--net=none:     //容器使用自己的网络(类似--net=bridge),但是不进行配置


启动已停止运行的容器

查看所有的容器(包括已停止)命令如下:

docker ps -a

使用 docker start 启动一个已停止的容器:

docker start b750bbbcfd88 

后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式

 docker run -itd --name ubuntu-test ubuntu /bin/bash

注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec


停止一个容器

停止容器的命令如下:

docker stop <容器 ID>

停止的容器可以通过 docker restart 重启:

docker restart <容器 ID>

进入容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

  • docker attach
  • docker exec:推荐使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止
attach 命令
docker attach 1e560fca3906 

8.png

注意: 如果从这个容器退出,会导致容器的停止

exec 命令
docker exec -it 243c32535da7 /bin/bash

9.png

更多参数说明可使用 docker exec --help 命令查看。


导出和导入容器

导出容器

如果要导出本地某个容器,可以使用 docker export 命令

docker export 1e560fca3906 > ubuntu.tar

导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
10.png
这样将导出容器快照到本地文件


导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1

 cat docker/ubuntu.tar | docker import - test/ubuntu:v1

11.png
此外,也可以通过指定 URL 或者某个目录来导入,例如:

docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

删除容器使用 docker rm 命令:

docker rm -f 1e560fca3906

12.png

1

打赏

评论

博主关闭了当前页面的评论