4.dockerfile介绍

dockerfile介绍

Docker语法规则

命令用途
FROMbase image,准备一个基础镜像,从哪里开始?
RUN执行命令
ADD添加文件 比COPY更加强大,可以添加远程文件
COPY拷贝文件
CMD执行文件
WORKDIR制定路径
MAINTAINER维护者信息
ENV设置环境变量
ENTRYPOINT容器入口,跟commit有点像,但是权重比较commit高
USER指定用户运行
VOLUME挂在磁盘卷

镜像分层

  1. Dockerfile中的每一行都产生一个新层
FROM alpine:latest        4e38e38c8ce0

MAINTAINER XSW            fb1aabf4427b

CMD echo "hello Docker"   3df065bfdff6
  1. 每个一个命令都是一层,只有容器层是RW,镜像中的各层都是RO
  2. 分层的好处:假如有很多container 或者很多的Image的话,这些层可以共享。那么存储压力会小很多。运行起来方便。
  3. 镜像分层,有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实战

  1. 用dockerfile构建自己的image
创建Dockerfile,dockerfile 用来创建docker镜像。

touch Dockerfile
  1. 第一个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 #运行
  1. 第二个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三者都是用于执行命令,那么这三者之间有何异同呢:

  1. 相同之处:三者都是用来运行指令的;
  2. 不同之处:
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操作

  1. 第一种方式:
docker run -d --name nginx -v /user/share/nginx/html nginx  #运行容器内部地址nginx用来访问网页的地址 /usr/share/nginx/html

docker inspect nginx  #容器内所有信息,包括检查文件映射关系

  1. 第二种方式:
    运行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 基础镜像
  1. 第三种方式
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 安装

  1. Mac/Windows:
    安装docker的时候附带安装了。

  2. 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
imagepull镜像
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

  1. 创建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

  1. 创建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;
        }
    }
}
  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值