菜鸟教程学习日记
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 ps
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
docker logs ID
查看容器标准输出
docker run -it ubuntu /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
cat docker/ubuntu.tar | docker import - 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就是容器名了。
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 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
各个选项说明:
获取一个新的镜像
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 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
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
参数说明:
其中 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
cat /etc/issue
sudo docker rm $(sudo docker ps -a -q)
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