Docker入门
一、Docker简介
1.什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。
核心概念:
1.Docker镜像
类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统。
例如:一个镜像可以包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。镜像也可以安装了Apache应用程序,可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并通过简单的命令就可以直接使用。
2.Docker容器
Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。
可以把容器看做一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序打包而成的应用盒子。
镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。
3.Docker仓库
Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。
注册服务器:Registry
注册服务器是存放仓库的地方,其上往往放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
根据所存储的镜像公开分享与否,Docker仓库可以分为
- 公开仓库(Public):最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。
- 私有仓库(Private):用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需将其从仓库上pull下来就可以了。
2.安装
官网:www.docker.com
Linux安装:
$ sudo wget -qO- https://get.docker.com/ | sh
安装docker本身
sudo:当前用户是普通用户,但执行该命令时使用root身份执行
wget:命令行下载工具
-q:使wget输出不要那么多
O-:把wget的输出直接输出到标准输出,而不是输出到文件
|:管道
| sh:把输出交给sh
$ sudo usermod -aG docker xxx
允许非root用户(非superuser)来运行docker
修改用户组,把这个用户组加入到docker组里面(用户如果在docker组里,则可以不用sudo,不需要root就可以执行docker命令)
检查是否安装成功:docker info
如果执行此命令报错,则是docker没有启动,在centos中,使用
service docker start
安装docker.png
查看信息.png
3.Docker架构
docker架构.pngDocker host:进行docker操作的宿主机
Docker Daemon:负责各种各样的docker操作,比如下载docker镜像,运行一个容器,客户端通过命令,把命令交给docker daemon,由docker Daemon来做实际的操作。
Registry:互联网的saas服务,daemon可以和registry交互,比如获取一个image,或者push一个image;是Docker的镜像存储服务端。
客户端和守护进程进行操作,把命令送给守护进程,守护进程拖取镜像,运行容器并和远端的镜像仓库进行交互。
4.使用docker
docker run centos echo hello docker
1787a55467271333a42791543e0fbf4.png
在centos这个image里运行了echo hello docker命令
docker在运行一个容器之前会先查看本地是否有该容器需要的image,如果没有则会从远端下载。
使用docker images命令查看本地的所有images:
docker images.png
docker run -p 8080:80 -d daocloud.io/nginx
返回一串字符串:contain的id
-p:做端口映射,把docker nginx本身的80端口映射到本地的host的8080端口。
-d:允许程序直接返回,把container作为守护进程来执行。
使用docker ps命令查看当前正在运行的docker的container:
dockerps.png5.docker基础命令
命令 | 用途 |
---|---|
docker pull | 获取image(镜像) |
docker build | 创建image |
docker images | 列出image |
docker run | 运行container |
docker stop 容器id | 停止容器 |
docker ps | 列出正在运行的container |
docker ps -a | 列出所有的container |
docker rm 容器id | 删除container |
docker rmi | 删除image |
docker cp | 在host和contaiiner之间拷贝文件 |
docker commit | 保存改动为新的image |
二、镜像与容器
1.docker commit
在使用docker cp index.html 32daa9dcs45c://usr/share/nginx/html修改了nginx的图片页面,停止再重启docker容器,
使用docker run -p 8080:80 -d daocloud.io/nginx查看,之前所做的改动会失效:
docker在容器内所做的修改的都是暂时的,没有被保存下来的
要永久保存:
修改:docker cp index.html e5f32u43k51://usr/share/niginx/html
保存:docker commit -m 'fun' e5f32u43k51 nginx-fun 返回一个新产生的imageid
此时是产生了一个跟之前一模一样的image,可以把之间的删除掉。
2.dockerfile
通过编写简单的文件自创docker镜像
第一个Dockerfile
FROM alpine:latest 要产生的新镜像有一个baseimage基础镜像
MAINTAINER hcx 共享时告诉其他人,这是hcx写的
CMD echo 'hello docker' 运行的命令:echo ‘hello docker’
alpine:专门针对Docker来做的一个极小的linux环境
docker build
使用Docker命令构建一个image:
docker build -t hello_docker .
-t:设定一个标签:hello_docker
.:路径名,把该路径下的所有内容送到docker engine,让其产生image。
e9f1c24c261b4fb4744eb1ad06555ed.png
docker images hello_docker:查看是否生成了该文件
docker run hello_docker:运行该image
Dockerfile语法
命令 | 用途 |
---|---|
FROM | base image (指定一个基础镜像) |
RUN | 执行命令 (在容器内执行一个命令) |
ADD | 添加文件(往容器中添加文件,还可以将远程的文件加入到容器里面) |
COPY | 拷贝文件(拷贝一个文件或目录) |
CMD | 执行命令 (给容器指定一个执行的入口) |
EXPOSE | 暴露端口 |
WORKDIR | 指定路径(指定命令运行的路径) |
MAINTAINER | 维护者 |
ENV | 设定环境变量 |
ENTRYPOINT | 容器入口 |
USER | 指定用户(指定执行该命令的用户) |
VOLUME | mount point(指定容器所挂载的卷) |
3.镜像分层
Dockerfile中的每一层都产生一个新层
FROM alpine:latest 4e38e38c7ct0
MAINTAINER hcx fb1gail4315b
CMD echo 'hello docker' 8gf243gsfe8
镜像分层.png
三、容器存储
1.Volume
提供独立于容器之外的持久化存储
2.Volume操作
$ docker run -v /usr/share/nginx/html nginx
771c87f9b0081506f446eddc0da058d.png
docker inspect nginx
a31115298de1c2e9b9cac8a3ccf2e2b.png
b2d74e01849fcdfea0bfe5df4dd4026.png
本地目录挂在到容器里的
$ docker run -v $PWD/code:/var/www/html nginx
把当前的目录映射到容器里:
$ docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx
$PWD:shell的宏变量,始终指向当前目录
$PWD/html:当前目录下的html目录
/usr/share/nginx/html:挂载在容器里的目录
把当前的host目录挂到容器里的/usr/share/nginx/html目录
$ docker run -volumes-from
四、Registry 镜像仓库
English | 中文 |
---|---|
host | 宿主机 |
image | 镜像 |
container | 容器 |
registry | 仓库 |
daemon | 守护进程 |
client | 客户端 |
$ docker search whalesay
$ docker pull whalesay
$ dorcker push myname/whalesay
国内的一些仓库:
- daocloud
- 时速云
- aliyun
产生一个新tag,并共享到hub里:
5e7509d03896647cfa120ce4b3e4112.png五、docker-compose 多容器app
1.安装docker-compose
linux上安装docker-compose:
curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s) -$(uname -m) > /usr/local/bin/docker-compose
下载一个二进制文件再将其变为可以执行的
docker-compose:
docker-compose.pngdocker-compose.yaml:
docker-compose.yaml.pngdocker-compose.yml常用命令:
命令 | 用途 |
---|---|
build | 本地创建镜像 |
command | 覆盖缺省命令 |
depends_on | 连接容器 |
ports | 暴露端口 |
volumes | 卷 |
image | pull镜像 |
up | 启动服务 |
stop | 停止服务 |
rm | 删除服务中的各个容器 |
logs | 观察各个容器的日志 |
ps | 列出服务相关的容器 |
网友评论