部分内容参考自:这可能是最为详细的Docker入门吐血总结
Docker 是什么Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包环境到一个可移植的容器中,然后一并发布到任何操作系统的机器上。
LXC:Linux Container 容器是一种内核虚拟化技术。与宿主机使用同一个内核。
Docker 利用LXC来实现类似传统虚拟机如 VMware的功能。同VM的方式不同,LXC 并不是硬件虚拟化,而是一个操作系统级虚拟化方法。设计之初也不是VM替代品。相较于VM,LXC与宿主机使用同一个内核,性能损耗小。docker 启动快速属于秒级别。VM通常需要几分钟去启动。
Docker在本质上是一个附加系统。 可能更为重要的是,Docker旨在用于弹性计算。每个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。
Docker实例是无状态的。这意味着它们不应该承载任何数据,所有数据应该保存在数据库服务器中。
Docker 有什么Docker 中包括三个基本的概念:
- Image(镜像)
- Container(容器)
- Repository(仓库)
Docker Image 可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。就是一堆只读层(read-only layer)。
Docker Container 镜像运行起来就是容器,可以理解是镜像的实例。是静态的镜像文件在宿主机上动态运行的进程。
容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。镜像是文件,容器是进程。
容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去 (commit)成为新的镜像。
Docker Repository 是集中存放镜像文件的仓库。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry镜像,可以直接使用做为私有 Registry 服务。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
- DockerClient 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- DockerContainer 容器
Docker daemon 一般在宿主主机后台运行,作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。
Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker 安装和使用Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费,支持周期 7 个月), EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 的安装请参考官方文档:
MacOS:https://docs.docker.com/docker-for-mac/install/
Windows:https://docs.docker.com/docker-for-windows/install/
Ubuntu:https://docs.docker.com/install/linux/docker-ce/ubuntu/
CentOS:https://docs.docker.com/install/linux/docker-ce/centos/
其他 Linux 发行版:https://docs.docker.com/install/linux/docker-ce/binaries/
以 CentOS7 作为本文的演示。
卸载掉旧版本的 Docker$ yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
安装依赖包
$ yum install -y yum-utils
device-mapper-persistent-data
lvm2
安装Docker
Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。所以可以直接使用yum 命令
$ yum install docker
验证是否安装成功
docker version # or docker info
启动Docker-CE
$ systemctl enable docker $ systemctl start docker
搜索 仓库中 image 文件
docker search mysql
抓取 image 文件
docker pull library/hello-world # OR docker pull mysql:5.7
docker pull 是抓取 image 文件。
library/hello-world 是 image 文件在仓库里面的位置,其中 library 是 image 文件所在的组, hello-world 是 image 文件的名字。
mysql:5.7 是mysql 在docker仓库中的位置,mysql是文件名,:5.7是一个可选tag,如上述hello-world没有tag则默认latest。
查看本机 image 文件
docker images
运行 hello-world 这个 image 文件。运行后就会创建出对应的容器。
docker run hello-world # OR docker run --name mysql # mysql5.7在docker中的别名mysql -p 23306:3306 # 映射到docker的23306端口,由docker所在主机:23306提供mysql读写 -v /dockerdir/mysql/conf:/etc/mysql/conf.d -v /dockerdir/mysql/logs:/logs -v /dockerdir/mysql/data:/var/lib/mysql # 数据目录映射到docker的目录 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 镜像
查看当前有哪些容器
docker ps -a
-a 是查看当前所有的容器,包括未运行的。
对一个现有的容器进行启动,重启和停止。
docker start container_name/container_id docker restart container_name/container_id docker stop container_name/container_id
进入到这个容器中
docker attach container_name/container_id
删除指定镜像。由于 image 被某个 container 引用(正在被运行),如果不将这个引用的 container 销毁,那 image 肯定是不能被删除。
1先去停止这个容器
docker stop container_name/container_id
2删除这个容器
docker rm container_name/container_id
3删除这个镜像
docker rmi image_nameDockerfile 是什么
Dockerfile由一行行命令语句组成,指令集;Dockerfile 中的命令非常类似于 linux 下的 .sh 、windows下的.bat
一般来说,我们可以将 Dockerfile 分为四个部分:
- 基础镜像(父镜像)信息指令 FROM
- 维护者信息指令 MAINTAINER
- 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
- 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
下面是一段简单的Dockerfile的例子:
FROM python:2.7 MAINTAINER Angel_Kitty COPY . /app WORKDIR /app RUN pip install -r requirements.txt EXPOSE 5000 ENTRYPOINT ["python"] CMD ["app.py"]
分析一下上面这个过程:
1、从 Docker Hub 上 pull 下 python 2.7 的基础镜像
2、显示维护者的信息
3、copy 当前目录到容器中的 /app 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里
4、指定工作路径为 /app
5、安装依赖包
6、暴露 5000 端口
7、启动 app



