docker
一、简介及安装
面向用户
- 开发,测试,运维
预备知识
- linux命令行
- bash
简介
- docker:an open source project to pack, ship and run and application as la lightweight container.(一个开源项目,可以用来将应用以轻量级容器的形式来打包,发布和运行。)
- allows to package an application with all of its dependencies into a standardized unit.(允许一个应用程序及其所有依赖以一种标准单位来打包。)
类比
- 可以粗糙的理解为轻量级的虚拟机
- 开挂的chroot(对应用程序做了文件和系统的分离)
虚拟机构成
- server
- host os
- hypervisor # 虚拟层,虚拟出了硬件
- guest os
- Bins/libs
- app
docker构成
- server
- host os
- Docker engine # 利用了host os 的namespace 和control group 来做到将app分离。因为没有虚拟层,它比虚拟机轻量级,程序启动速度和内存需求都会小很多。
- Bins/libs
- app
mac安装
官网:www.docker.com
下载:brew cask install docker
网易镜像地址http://hub-mirror.c.163.com
在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
二、实践第一步
常见名词
English | 中文 |
---|---|
host | 宿主机(正在使用的电脑) |
Image | 镜像(从远端拉取或者本地构建的可以重复使用的软件的大包) |
container | 容器(镜像的运行实体) |
registry | 仓库(存放镜像) |
daemon | 守护进程(用来接收用户命令) |
client | 客户端(客户操作,用来给daemon传输命令) |
命令小结
命令 | 用途 |
---|---|
docker pull | 从远端registry获取image |
docker build | 创建image |
docker images | 列出本地image |
docker run | 运行container |
docker ps | 列出正在运行container |
docker ps -a | 列出所有container |
docer rm | 删除已经结束的container |
docker rmi | 删除image |
docker cp | 在host和container之间拷贝文件 |
docker commit | 保存改动,生成新的image镜像 |
操作示例
docker run
docker info
docker run ubuntu echo hello docker
docker run nginx # 运行一个容器,先从本地查找,没有到话就去远端的registry下载
docker images # 查看本地images
docker run -p 8080:80 -d daocloud.io/nginx
# -p 端口映射 -d 允许将container直接返回
# 返回值为container_id
docker ps # 查看container
docker cp index.html aaaaaa://usr/share/nginx/html
# 将文件拷贝到容器中
# 需要参数分别为 文件 容器id 容器内部的路径
docker stop container_id # 停止一个容器
重启后index.html没有生效,是因为docker在容器内做的操作都是暂时的
持久化:
docker commit -m "fun" container_id
# 返回值为新的 image_id
docker commit -m "fun" container_id image_name
删除image
docker rmi image_id
清楚运行的container
docker stop container_id
docker ps # 当前正在运行的容器
docker ps -a # 列出所有的容器,包括已停止的
docer rm container_id1 container_id2
三、dockerfile镜像
通过编写简单的文件自创docker镜像
docker commit -m "fun" container_id image_name
第一个dockerfile
FROM alpine:lastest # 基础镜像的名字
# alpine 极小的linux环境,针对docker
MAINTAINER xbf # 作者
CMD echo "hello docker" # 运行容器时产生的效果
mkdir d1
touch Dockerfile
FROM alpine:lastest
MAINTAINER xbf
CMD echo "hello docker"
docker bulid -t hello_docer .
# -t 指定标签名, . 表示当前路径都送给docer engine 用来产生image
docker images hello_docker
docker run hello_docker
第二个dockerfile
docker run -d -p 80:80 xbf/hello-nginx
dockerfile语法
命令 | 语法 |
---|---|
from | 指定base image |
run | 执行命令 |
add | 添加文件 (可以讲远程文件加到容器) |
copy | 拷贝文件 |
cmd | 执行命令 |
expose | 暴露端口 |
workdir | 指定路径 |
maintainer | 维护者 |
env | 设定环境变量 |
entrypoint | 容器入口 |
user | 指定用户 |
volume | Mount point (指定容器挂载的卷) |
镜像分层
dockerfile中的每一行都会产生一个新层
每一行 都是单独保存
FROM alpine:lastest #
MAINTAINER xbf #
CMD echo "hello docker" #
已经存在image里边的层是只读的,容器层是可读可写的
镜像在运行起来的时候里面的层是只读的,在其上的容器层是可读可写的
相同的镜像层会复用,一定程度上减小了空间的使用
四、存储
volumn介绍
提供独立与容器之外的持久化存储,可以被其他容器进行访问。
volumn操作
方式一:
运行一个容器并(-v)挂载一个卷
docker run -v /usr/share/nginx/html nginx
macOS 中多了一层虚拟层
因此不能直接访问到 Mounts 中的 Source 路径
需要先使用 screen 命令进入到 tty 中
容器信息中
- Mounts代表挂载信息
- Source是宿主机位置
- Destination是容器中的位置
docker run -d --name nginx -v /usr/share/nginx/html nginx
docker inspect nginx
screen ...../tty
docker exec -it ngnix /bin/bash
方式二:
本地目录挂载到容器内的数据卷(虚拟卷)
可以映射宿主机目录到容器中
docker run -v $PWD/code/:/var/www/html ngnix
docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html ngnix
注意:
- $PWD - shell 命令中本地当前目录的环境变量
- nginx的配置文件/etc/nginx/conf.d/default.conf中默认的根路径root是/usr/share/nginx/html,所以此处配置容器中的目标路径是/var/www/html并不能在浏览器中打开本地的index.html,需要更改绑定路径或nginx根路径
方式三:
使用其他容器创建的存储(挂载其他容器的数据卷)
docker run -volumes-from [容器数据目录]
docker create -v $PWD/data:/var/mydata data_containerd
五、镜像仓库
常用命令
docker search xxx # 从registry中搜索镜像
docker pull xxx # 拉取镜像
docker push xxx/yyy # 推送自己的镜像到仓库
国内的一些仓库
- daocloud
- 时速云
- aliyun
registry操作
docker search whalesay
docker pull docker/whalesay
docker images
docker run docker/whalesay cowsay 'haoge zhenniubi'
docker tag docker/whalesay mxt/whalesay
docker push mxt/whalesay
docker login
hub.docker.com
六、多容器app
docker-compose安装
- Mac/windows:自带
- Linux:
curl https://github.com/docker/compose/releases/download/1.9.0
三个容器:
- ngnix
- Ghost app
- mysql
docker-compose.yaml
yaml是一种常用的配置文件格式,通过缩进表示层级关系
ghost-app:
build: ghost
depends_on:
- db
ports:
- "2368:2368"
nginx
build: nginx
ports:
- "80:80"
depends_on:
- ghost-app
db:
image:"mysql:5.7.15"
三个顶层的对象,对应三个服务,分别有自己的描述。
实战
config.js
var path = require('path'),
config;
config = {
production:{
url: 'http://mytestblog.com',
mail: {},
database: {
client: 'mysql',
connection: {
host: 'db',
user: 'ghost',
password: 'ghost',
database: 'ghost',
port: '3306',
charset: 'utf-8'
},
debug: false
},
paths: {
contentPath: path.join(process.env.GHOST_CONTENT, '/')
},
server: {
host: '0.0.0.0',
port: '2368'
}
}
};
module.exports = config;
ngnix.conf
worker_processes 4;
events {worker_connections 1024;}
http {
server{
listen 80;
location / {
proxy_pass http://ghost-app:2368;
}
}
}
docker-compose.yml
version: '2'
networks:
ghost:
services:
ghost-app:
build: ghost
networks:
- ghost
depends_on:
- db
ports:
- "2368:2368"
ngnix:
build: ngnix
networks:
- ghost
depends_on:
- ghost-app
ports:
- "80:80"
db:
image: "mysql:5.7.15"
networks:
- ghost
environment:
MYSQL_ROOT_PASSWORD: mysqlroot
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost
volumes:
- $PWD/data:/var/lib/mysql
ports:
- "3306:3306"
mkdir ghost
cd ghost
mkdir ghost
mkdir nginx
mkdir data
cd ghost
touch Dockerfile
vi Dockerfile
FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
CMD ['npm', 'start', '--production']
cp ../../backup/ghost/ghost/config.js
cat config.js
cd ../ngnix
touch Dockerfile
FROM ngnix
COPY ngnix.conf /etc/ngnix/ngnix.conf
EXPOSE 80
touch ngnix.conf
vi ngnix.conf
cd ..
touch docker-compose.yml
vi docker-compose.yml
docker-compose up -d
步骤
-
创建三个目录:
data
、ghost
、ngnix
-
ghost
和ngnix
是用来存放dockfile和配置文件,用来构建镜像 -
data
是用来存放博客需要的数据 -
compose是用名字把各个服务链接起来,它自己会做名字解析
拉起
docker-compose up -d
停止
docker-compose stop
docker-compose rm
构建
docker-compose build
compose拉取三个容器,这三个容器间互相协作,完成了一个多容器的app。
Docker-compose.yml 常用命令
命令 | 用途 |
---|---|
build | 本地创建镜像 |
command | 覆盖缺省命令 |
Depends_on | 容器之间的依赖关系 |
ports | 定义和暴露端口 |
Volumes | 卷 |
image | pull镜像 |
Docker-compose命令
命令 | 用途 |
---|---|
up | 启动服务 |
stop | 停止服务 |
rm | 删除服务中的某个容器 |
logs | 查看各个容器的命令 |
ps | 列出服务相关的容器 |
网友评论