docker学习日记

docker学习日记

菜鸟教程学习日记

是什么?

Docker 包括三个基本概念:

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

安装:

自行百度

容器:

创建:

docker run -i -t ubuntu:15.10 /bin/bash
各个参数解析:

  • docker: Docker 的二进制执行文件。
  • run: 与前面的 docker 组合来运行一个容器。
  • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

docker ps
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

docker logs ID 查看容器标准输出

启动:

docker run -it ubuntu /bin/bash

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

查看所有容器
docker ps -a
启动一个已经停止的容器
docker start ID
后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash

重启
docker restart ID
进入容器
docker attach ID
docker exec ID推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

导入/导出

导出:docker export ID > ubuntu.tar

  • 导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。
    导入:cat docker/ubuntu.tar | docker import - test/ubuntu:v1
  • 可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo

导入到处文件

1、从容器里面拷文件到宿主机?

 答:在宿主机里面执行以下命令

         docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 

 示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,  现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?

 答案:在宿主机上面执行命令

docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
2、从宿主机拷文件到容器里面

  答:在宿主机里面执行如下命令

          docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

   示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?

   答案:在宿主机上面执行如下命令     

docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
3、在这里在记录一个问题,怎么看容器名称?

  执行命令:docker ps,出现如图所示,其中NAMES就是容器名了。
事例:运行一个 web 应用

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py

参数说明:

  • -d:让容器在后台运行。

  • -P:将容器内部使用的网络端口映射到我们使用的主机上。

docker ps
通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

查看web应用程序的日志
docker logs -f ID/name 可以查看容器内部的标准输出
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
查看web应用程序容器的进程
docker top ID/name
停止web应用程序
docker stop ID/name
重启web应用程序
docker start ID/name
查询最后一次创建的容器
docker ps -i

停止:

docker stop ID/name

删除:

docker rm -f ID

镜像的使用

查看本地主机上的镜像
docker images
各个选项说明:

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

获取一个新的镜像
docker pull ubuntu:13.10
查找镜像
docker search httpd
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。

删除镜像
docker rmi ID/name

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

1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名

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

runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

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 命令来构建一个镜像。

runoob@runoob:~$ 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 "[email protected]"
 ---> Using cache
 ---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Using cache
 ---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。

runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

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

容器链接

网络端口映射

docker run -d -P training/webapp python app.py

我们使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 5000:5000 training/webapp python app.py

另外,我们可以制定容器绑定网络地址,比如绑定127.0.0.1

docker run -d -p 127.0.0.1:5001:500 training/webapp python app.py

这样我们就可以通过访问127.0.0.1:5001 来访问容器的5000端口
上面的例子红,默认都是绑定tcp端口,如果要绑定udp端口,可以在端口后面加/udp
docker port 命令可以让我们快捷查看端口的绑定情况

容器互联
端口映射并不是吧docker链接到另一个容器的方法
docker 有一个链接系统允许多个容器一起,共享链接信息
docker 链接会创建一个父子关系,其中父子容器可以看到子容器的信息
容器命名:
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

docker run -d -P --name runoob training/webapp python app.py

我们可以使用docker ps 命令来查看容器名称
新建网络

docker newtork create -d bridge test-net

参数说明:

  • -d:参数指定 Docker 网络类型,有 bridge、overlay。

其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
链接容器
运行一个容器并连接到新建的 test-net 网络:

docker run -idt --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

docker run -itd --name test2 --network test-net ubuntu /bin/bash

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。

apt-get update
apt install iputils-ping

在 test1 容器输入以下命令:

docker exec -it test1 /bin/bash
ping test2

配置DNS
我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:
如果只想在指定的容器设置 DNS,则可以使用以下命令:

docker run -it --rm host_ubuntu --dns=114.114.114.114.114 --dns-search=test.com ubuntu

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

常见报错

https://blog.csdn.net/grace_yi/article/details/80043426

常见操作

批量删除tag为空的镜像
docker images|grep none|awk ‘{print $3}’|xargs docker rmi

sudo docker rmi sudo docker images | grep none | awk '{print $3}'
删除悬空镜像,比如下载失败的,配置失败的
sudo docker image prune -a -f

查看docker镜像版本

cat /etc/issue

删除所有容器

sudo docker rm $(sudo docker ps -a -q)

迁移docker目录方法:

1.先停止docker服务

service docker stop

或systemctl stop docker

2.拷贝原docker容器目录文件到新挂载磁盘目录

cp -a /var/lib/docker /disk01/docker

3.vim /usr/lib/systemd/system/docker.service

docker启动参数增加–graph=/disk01/docker

4.重新启动docker

df -h 查看容器所用磁盘仍是原路径

还需刷新下

systemctl daemon-reload

重启docker服务
service docker restart

或者systemctl restart docker

df -h

你可能感兴趣的:(工具,笔记)