https://www.cnblogs.com/pyyu/p/9485268.html#
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。
容器里面的应用,直接就是底层系统的一个进程。
多个容器可以共享资源。
容器只包含他用到的组件。
docker创建的所有虚拟实例共有一个Linux内核。
docker三大概念:镜像,容器,仓库
镜像就是一个只读模板,镜像可以用来创建容器。
union FS技术,分层存储,
镜像和容器的关系,就像类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。
容器可以被创建,启动,停止,删除,暂停
docker利用容器来运行应用程序
容器是从镜像创建的运行实例,每个容器之间是隔离的。
可以把容器看作一个简易版的Linux环境和运行在其中的应用程序。
仓库是集中存放镜像的地方,仓库分为公开仓库public和私有仓库private。最大的公开仓库是docker hub,存放了数量庞大的镜像供用户下载。
当用户创建的了自己的镜像后就可以使用push命令将他上传到公有或私有仓库。
国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。
使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。
官方教程如下,最正确安装docker姿势
docker最低支持centos7且在64位平台上,内核版本在3.10以上
[root@oldboy_python ~ 10:48:11]#uname -r
3.10.0-693.el7.x86_64
1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2.设置存储库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.安装docker社区版
sudo yum install docker-ce
4.启动关闭docker
systemctl start docker
Docker镜像加速器
一条命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
docker基础命令注释
[root@docker ~]# docker --help
使用docker镜像
从仓库获取镜像
管理本地主机的镜像
获取镜像
从docker registry获取镜像的命令是docker pull。命令格式是:
docker pull [选项][docker registry地址] 仓库名:标签
image文件是通用,可以共享的
列出所有的image文件
docker image ls
删除image文件
docker image rm [imagename]
[root@docker ~]# docker search centos #搜索所有centos的docker镜像
可以使用docker pull命令来从仓库获取所需要的镜像。
[root@docker ~]# docker pull centos #获取centos镜像
[root@docker ~]# docker run -it centos /bin/bash #完成后可以使用该镜像创建一个容器
镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。
TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息。
[root@docker ~]# docker images #查看docker镜像
如果要移除本地的镜像,可以使用docker rmi命令(在删除镜像之前先用docker rm删除依赖于这个镜像的所有容器)。注意docker rm 命令是移除容器。
[root@docker ~]# docker rmi imageID #删除docker镜像
如果要导出镜像到本地文件,可以使用docker save命令。
[root@docker ~]# docker save centos > /opt/centos.tar.gz #导出docker镜像至本地
可以使用docker load从本地文件中导入到本地docker镜像库
[root@docker ~]# docker load < /opt/centos.tar.gz #导入本地镜像到docker镜像库
[root@docker~]# docker images #查看镜像导入情况
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在停止状态(stopped)的容器重新启动。
[root@docker ~]# docker run centos /bin/echo "hehe"
[root@docker ~]# docker run --name mydocker -it centos /bin/bash#启动一个终端,允许用户进行交互。
--name:给容器定义一个名称
-i:则让容器的标准输入保持打开。
-t:让Docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash:执行一个命令
当利用docker run来创建容器时,Docker在后台运行的标准操作包括
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个ip地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
获取镜像 hello-world
docker pull hello-world
检查镜像
docker images
运行image文件,可以用容器id
docker run hello-world
检查docker容器进程
docker ps
检查所有运行过的容器
docker ps -a
运行一个Ubuntu容器
[root@oldboy_python ~ 11:52:22]#docker pull ubuntu:14.04
下载过程可以看出镜像是由多层存储构成的。下载也是一层一层,并非单一的文件。
下载过程中给出每一层的前12位ID。下载结束后会给出sha246的文件一致性校验值。
运行Ubuntu容器
[root@oldboy_python ~ 12:18:53]#docker run -it --rm ubuntu:14.04 bash
root@3efbb2749d7c:/# cat /etc/os-release
使用exit退出容器
docker run就是运行容器的命令。
参数
-it : -i 是交互式操作,-t是终端
-rm : 容器退出后将其删除。也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间。
ubuntu:14.04 这指的是镜像文件
bash : 指定用交互式的shell,因此需要bash命令
-d参数:后台运行容器,返回容器ID
[root@oldboy_python ~ 15:58:14]#docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
docker start c02
docker stop c02
docker logs c02
docker rm c02
docker ps
docker images #列出所有本级镜像
docker pull centos #获取新的centos镜像
docker search nginx #搜索nginx镜像
构建镜像
1.通过commit修改镜像
2.编写dockerfile
进入容器
使用-d参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach命令或nsenter工具等。
docker exec -it 容器id
docker attach 容器id
提交创建自定义的镜像(docker container commit)
1.我们进入交互式的centos容器中,发现没有vim命令
docker run -it centos
2.在当前容器中,安装一个vim
yum install -y vim
3.安装好vim之后,exit退出容器
exit
4.查看刚才安装好vim的容器记录
docker container ls -a
5.提交这个容器,创建新的image
docker commit 059fdea031ba chaoyu/centos-vim
6.查看镜像文件
[root@master /home]docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
外部访问容器
容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。
-P 参数会随机映射端口到容器开放的网络端口
[root@oldboy_python ~ 16:31:37]#docker run -d -P training/webapp python app.py
检查映射的端口
宿主机ip:32768 映射容器的5000端口
[root@oldboy_python ~ 16:34:02]#docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi
也可以通过-p参数指定映射端口
指定服务器的9000端口,映射到容器内的5000端口
[root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py
查看指定容器的端口映射
[root@oldboy_python ~ 16:49:01]#docker port c0b
5000/tcp -> 0.0.0.0:9000
查看容器内的进程
[root@oldboy_python ~ 16:49:05]#docker top c0b
利用dockerfile定制镜像
镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。
镜像的定制就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
网友评论