文章目录
dockerfile介绍
Docker语法规则
命令 | 用途 |
---|---|
FROM | base image,准备一个基础镜像,从哪里开始? |
RUN | 执行命令 |
ADD | 添加文件 比COPY更加强大,可以添加远程文件 |
COPY | 拷贝文件 |
CMD | 执行文件 |
WORKDIR | 制定路径 |
MAINTAINER | 维护者信息 |
ENV | 设置环境变量 |
ENTRYPOINT | 容器入口,跟commit有点像,但是权重比较commit高 |
USER | 指定用户运行 |
VOLUME | 挂在磁盘卷 |
镜像分层
- Dockerfile中的每一行都产生一个新层
FROM alpine:latest 4e38e38c8ce0
MAINTAINER XSW fb1aabf4427b
CMD echo "hello Docker" 3df065bfdff6
- 每个一个命令都是一层,只有容器层是RW,镜像中的各层都是RO
- 分层的好处:假如有很多container 或者很多的Image的话,这些层可以共享。那么存储压力会小很多。运行起来方便。
- 镜像分层,有10层和7层的可能有5层是共享的,可以共享使用
使用Dockerfile来创建Docker镜像时需要用到一些指令,如:FROM、RUN、MAINTAINER、WORKDIR、ADD、CMD、ENTRYPOINT、ENV、EXPOSE等等,上面列举的指令都是比较常用的,需要注意的是这些指令都必须是大写且放在行的开头。
FROM:指定基础镜像,一般我们在创建镜像是都是以另一个镜像为基础,就需要用FROM来指定,FROM一般放在Dockerfile的文件头,如:FROM java:8;
MAINTAINER:指定创建镜像的作者,如:MAINTAINER zslin.com "393156105@qq.com";
RUN:执行命令,如:RUN mkdir -p /web/(创建一个名为web的文件夹);
WORKDIR:指定当前工作目录,如:WORKDIR /web(设置当前工作目录为web,可以通过RUN pwd查看);
ADD:添加文件(夹),如:ADD zslin-1.0.jar /app.jar(复制并重命名);
CMD:执行命令,如:CMD ["ls", "-l"](列表);
ENTRYPOINT:执行命令,如:ENTRYPOINT ["bin/catalina.sh", "run"](启动tomcat);
ENV:配置环境变量,如:ENV CATALINA_HOME /web/tomcat8(配置tomcat目录);
EXPOSE:指定端口,如:EXPOSE 8080。
dockerfile实战
- 用dockerfile构建自己的image
创建Dockerfile,dockerfile 用来创建docker镜像。
touch Dockerfile
- 第一个dockerfile
格式 :
FROM alpine:latest
MAINTAINER XSW
CMD echo "hello Docker"
# FROM 表示基础镜像
# MAINTAINER 表示介绍
编写Dockerfile文件
docker build -t hello_docker .
# docker build 用来构建
# -t 表示给它一个标签
# . 表示通过当前目录下的所有文件来进行构建
docker run hello_docker #运行
- 第二个dockerfile
FROM ubuntu #基础镜像名字
MAINTAINER Mark #声明作者
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list #加速生成(类似换源)
RUN apt-get update #更新ubuntu程序库
RUN apt-get install -y nginx #安装nginx -y 省略提醒,一路默认。
#运行:
docker run -d -p 80:80 xbf/hello-nginx
RUN、CMD、ENTRYPOINT异同
从上面的描述可以看出:RUN、CMD、ENTRYPOINT
三者都是用于执行命令,那么这三者之间有何异同呢:
- 相同之处:三者都是用来运行指令的;
- 不同之处:
RUN:是在构建镜像是执行的,在Dockerfile中可以有多条,即使用docker build时执行;
CMD:可以在容器运行时(即docker run)加参数覆盖;
ENTRYPOINT:在容器运行时(即docker run)不可以被覆盖。
RUN的示例:
RUN cd /web/
RUN rm -rf *.*
说明:在镜像构建时进入到/web/目录,再删除该目录下的所有文件(相应命令直接跟在其后)。
CMD和ENTRYPOINT则是在容器运行是执行,在Dockerfile中只能有一条,如果多条只生效最后一条,即使用docker run时执行;
CMD的示例:
CMD ["rm", "-rf", "*.*"]
说明:CMD后面的命令如果没有任何参数可以直接跟上(如:RUN ls),但如果有参数就不能直接跟上,须要以数组形式出现;
Volume
volume概念
-
volume 提供独立于容器之外的持久化存储
-
docker 容器重启还原,volume中的数据可以改动不被还原。
-
volume 在容器外存储数据,且可被其他容器进行访问。
-
VOLUME持久存储,应用场景比如数据库,可以存储在容器外面的分卷上。
-
Volume可以提供容器跟容器之间的数据共享。
Volume操作
- 第一种方式:
docker run -d --name nginx -v /user/share/nginx/html nginx #运行容器内部地址nginx用来访问网页的地址 /usr/share/nginx/html
docker inspect nginx #容器内所有信息,包括检查文件映射关系
- 第二种方式:
运行docker时 用-v参数指定volume 的路径,然后再用inspect 查看volume映射到硬盘上的路径,然后再直接更改硬盘上的文件。
docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx(很好的用于开发)
# -p 端口映射
# -d Daemon守护模式执行
# -v 挂载,把当前路径$PWD/html挂载到/usr/share/nginx/html
# $PWD shell命令下的当前目录变量
# nginx 基础镜像
- 第三种方式
docker create -v $PWD/data:/var/mydata --name data_container ubuntu # -v 参数也可以指定硬盘路径映射(挂载)到容器的路径。
docker run --volumes-from data_container ubuntu /bin/bash # --volume-from可以实现容器间数据共享
docker exec -it nginx(容器名称) /bin/bash #进入容器中去看一下
Registry 镜像仓库
概念
host 宿主机,正在使用的电脑
image 镜像,可重复的软件打包
container 容器
registry 仓库,很多镜像的注册仓库
daemon:守护程序
daemon 守护程序,用来和registry共享,用来接受用户的命令
client 客户端
交互命令
docker search whalesay #search 搜索镜像
docke pull whalesay #pull 拉取镜像
docker push myname/whalesay #push 推送镜像
国内仓库
daocloud
官方仓库
时速云
aliyun
compose介绍
docker-compose 安装
-
Mac/Windows:
安装docker的时候附带安装了。 -
Linux:
curl https://github.com/docker/compos
compose-install-linux
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
uname -s # 输出:Linux
uname -m # 输出x86_64
#将docker-compose设置为所有人都可以执行
chmod a+x /usr/local/bin/docker-compose
docker-compose --version #检查docker-compose版本
compose 命令
- docker-compose.yml 常用命令
命令 | 用途 |
---|---|
build | 本地创建镜像 |
command | 覆盖缺省命令 |
depends_on | 连接容器 |
ports | 暴露端口 |
volumes | 卷 |
image | pull镜像 |
docker-compose up -d #启动服务
docker-compose stop #停止服务
docker-compose rm #删除服务中的各个容器
docker-compose build #因为已经有镜像了,不需要使用 up来拉取镜像
docker-compose ps #列出服务相关的容器
docker-compose logs #观察各个容器的日志
compose实战
NGINX —— ghost —— MySQL
mkdir ghost nginx data
- 创建ghost
cd ghost
vim dockerfile
FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2386
CMD ["npm","start","--production"]
vim 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
},
path:{
contentPath:path.join(process.env.GHOST_CONTENT,'/')
},
server:{
host:'0.0.0.0',
port:'2368'
}
}
};
module.exports = config;
dockerfile config.js
- 创建nginx
cd nginx
vim dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
vim nginx.conf
worker processes 4;
events {worker connections 1024;}
http {
server {
listen 80;
location / {
proxy_pass http://ghost-app:2368;
}
}
}
- vim docker-compose.yml
version: '2'
networks:
ghost:
servises:
ghost-app:
build: ghost
depends_on:
- db
ports:
- "2368:2368"
nginx:
build:nginx
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/libmysql
ports:
- '3306:3306'
#三个顶层对象,表示三个服务,分别是:ghost-app、nginx、db