1、docker架构 docker daemon(docker进程):负责职称docker container的运行以及本地images的管理。 dokder client:用户通过docker client访问docker,docker client提供pull、run等命令。 docker images:镜像---一个只读的模板,可以用来创建docker容器。docker提供了一个很简单的机制来创建镜像或者更新先有的镜像,用户甚至可以直接从其他人那里下载一个制作好的镜像来直接使用。 docker container:docker利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 2、安装docker 官方建议使用Ubuntu,本人使用centos7。 #yum install -y docker 安装命令 #docker version 查看版本,包含server和client #systemctl daemon-reload 重新载入systemd #systemctl start docker 启动docker 3、镜像 docker运行容器前需要本地存在对应的镜像,如无,docker会尝试先从默认的镜像仓库(默认使用docker hub公共注册服务器中的仓库)下载镜像。用户也可以通过配置使用自定义的镜像仓库。 http://hub. 获取镜像 #docker pull redis:3.0 在镜像仓库查找需要的redis版本,不加版本号,默认下载最新版 #docker images 查看镜像 #docker rmi a8a59477268d(id) 删除镜像 注意:删除镜像前,需要删除所有使用此镜像的容器。 #docker search redis 4、容器 容器是镜像的一个运行实例,所不同的是,它有额外的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。那么docker容器就是独立运行的一个或一组应用,以及他们的必须运行环境。 #docker ps 查看运行的容器列表 #docker ps -a 查看所以容器 # docker create --name redis -p 16379:6379 redis:3.0 只创建,不启动 参数:-i 标准输出 --name 容器名称 -p 指定端口 16379:6379 16379是主机端口,6379是容器对外端口 -t 让docker分配一个伪终端,并绑定到容器的标准输出上 #docker start redis(容器名或id) 启动容器 docker create创建容器,docker start启动容器,这种方法不常用。 而是使用docker run命令,创建并启动容器 # docker run --name redis1 -p 16380:6379 redis:3.0 直接启动redis 参数:-d 后台运行 #docker rm reids1(容器名或id) #docker stop redis(容器名或id) #docker kill redis(容器名或id) 5、进入容器 有时候需要进入容器内部做一些操作,如修改配置文件。 命令docker exec #docker exec -it redis1 /bin/bash(进入容器的第一个命令) 参数:-i 打开容器的标准输入 -t 伪终端 ctrl+D退出容器 查看容器启动日志 # docker logs -f redis1 6、仓库repository 一个容易与之混淆的概念就是注册服务器registry。实际上注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下有多个镜像。从这方面说,仓库可以被认为是一个具体的项目和目录。例如对于仓库地址dl.dockerpool.com/ubuntu来说,dl.dockerpool.com是注册服务器地址,ubuntu是仓库名。 阿里云仓库 https://cr.console.aliyun.com/#/imageList 将镜像推送到registry:
7、数据管理 容器在运行项目时会产生数据,比如运行的是mysql容器,那么一定有数据的产生,那么问题来了,数据是保存在容器内部还是外部? 如果将数据保存着容器内部,那么也就意味着我们改变了原有镜像,这种做法是不可取的,因为在后期的镜像升级将变得不可能。也就是说运行的镜像,最好不要改变,如果必须改变的(如修改配置文件),在改变后记得commit提交打成一个新的镜像。 显然,应该讲数据保存在容器的外部,也就是保存在主机上,那么容器该如何读取数据呢? 在create或run容器时,可以通过-v参数指定主机的目录,挂载到容器的某一个目录上,这样,容器就可以在这个目录读写数据了,从而实现容器和数据的分离。以mysql为例 # docker create --name percona -v /var/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.6 创建容器 参数:-v /var/mysql 本机目录 /var/lib/mysql 容器目录 -p 端口 -e 指定用户名密码 # docker start percona 启动容器 连接数据库创建库-表后,查看本机目录下生成了数据文件,实现了容器和数据分离。 8、构建镜像 dockfile文件,编写多条命令,描述了一个镜像构建细节。 分为四部分组成:基础镜像信、维护者信息、镜像操作指令和容器启动时执行指令。 #第一行必须指令基于的基础镜像 From ubutu #维护者信息 MAINTAINER docker_user docker_user@mail.com #镜像的操作指令 apt/sourcelist.list RUN apt-get update && apt-get install -y ngnix RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf #容器启动时执行指令 CMD /usr/sbin/ngnix |
|