Docker入门

参考资料:
慕课网Docker入门视频

Docker简介

Docker允许一个应用程序运行在独立的环境中,包含了他的所有依赖。

一些术语:

  • host: 宿主机
  • image:镜像
  • container: 容器
  • registry:仓库
  • daemon:守护程序,所以是 -d
  • client:客户端

Docker 架构

Docker入门_第1张图片
Docker入门_第2张图片

常用命令

  • docker pull: 获取镜像
  • docker build: 创建镜像
  • docker run xxx: 运行一个xxx镜像的容器
  • docker stop [容器id]:停止容器
  • docker rm [容器id]:删除容器,需要先停止该容器
  • docker images: 查看本地镜像
  • docker rim [镜像id]:删除镜像
  • docker ps: 正在运行的容器
  • docker ps -a: 所有容器,包含没在运行的
  • docker cp [file path] [容器id]:[容器内目标路径]:在宿主机和容器之间复制文件

docker 容器内的所有改动都是暂时的,不会保存,如果停止容器再重启,改动都将会消失。而下边的命令可以将容器内的改动保存下来:
docker commit -m 'xxxx' [容器id] [命名新镜像名称],他同时会生成一个新的镜像, 并返回它的id

常用参数

  • -p: 端口映射 port
  • -d: 容器以守护进程的方式执行 deamon
  • -t: 打tag

Dockerfile

通过编写一个Dockerfile可以方便的创建docker镜像

编写之后运行 docker build -t hello_docker .,表示创建镜像,命名为hello_docker,并把当前路径,也就是. 下的所有文件用来创建

文件示例:

FROM ubunt  // 基础镜像
MAINTAINER creabiine // 作者,如果上传了告诉大家是谁写的
RUN apt-get update  // 执行命令更新 apt-get
RUN apt-get install -y nginx // 执行命令安装nginx, -y表示不要询问
COPY index.html /var/www/html // 复制文件到容器
ENTRYPOINT ['/usr/sbin/nginx', '-g', 'deamon off;'] // 容器入口,将nginx在前台执行
EXPOSE 80 // 暴露端口

其他Dockerfile 文件语法

  • ADD 添加文件,比COPY更强大
  • CMD 执行命令,也可以替代ENTRYPOINT 做入口
  • WORKDIR 指定运行命令的路径
  • ENV 设定环境变量
  • USER 指定用户
  • VOLUME 指定容器所挂载的卷

镜像分层

Dockerfile 中的每一行都产生一个新层,每一层都对应一个自己的id。当镜像运行一个容器的时候,会产生一个新的容器层,容器层可读可写。

分层的好处在于,当有很多容器的时候,容器之间的层可能相同,就可以共享,而不同重复保存

VOLUME 卷挂载

之前说过,容器中的改变时暂时的,不会被保存,除非docker commit 生成一个新的镜像,这样的话容器停止,数据就会消失。而Volume 是独立于容器之外的持久化存储,可以用来保存需要持久化的数据,或在容器之间共享的数据。

同时也常用于映射宿主机的文件到容器,这样修改了宿主机的文件,容器的文件也会同步修改,非常方便。所以是 -v

volume的操作:

// 映射80端口,后台运行,映射本地的当前目录下的html文件夹到容器nginx的/usr/share/nginx/html目录
// $PWD表示当前目录
rocker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx

Registry 镜像仓库

docker有个官方仓库dockerhub,国内也有几个仓库

  • daocloud

  • 时速云

  • aliyun

  • 腾讯云

  • docker search xxx 搜索想要的镜像

  • docker pull xxx 拉下想要的镜像aliyun

  • docker push myname/xxx 上传自己制作的镜像

docker-compose 多容器app

docker-compose所使用的compose工具是一个独立于docker的工具,不过mac和windows在安装docker的时候都会捆绑着自动安装上。Linux要手动安装。

然后根据docker-compose.yml文件来描述多容器之间的关系,拉起一个多容器的app。

yml(yaml)是常用的docker-compose文件格式,也常用于其他的配置文件,使用缩进来表达层级关系。

例如有个如下架构的app:

Docker入门_第3张图片

version: '2' // 声明docker-compose的版本号
networks:  //申请一个名为ghost的网络,不写的话会自动帮你申请
	- ghost
services: // 服务
	ghost-app: // 程序应用服务命名为 ghost-app
		build: ghost // 去ghost目录进行构建
		networks: // 放入ghost网络
			- ghost
		depends_on: // 该服务依赖db,也就是数据库
			- db
		prots: // 暴露端口,把容器的2368映射到宿主机的2368
			- “2368:2368”

	nginx: // nginx服务命名为nginx
		build: nginx
		networks:
			ghost:
		depends_on:
			- ghost-app
		ports:
			- "80:80"
	db:  //  mysql数据库服务命名为 db
		image: "mysql:5.7.15" // 指定远程镜像,从registry中下载镜像,mysql的5.7.15版本
		networks:
			- ghost
		environment:  // 声明环境变量,来对mysql做一些定义
			MYSQL_ROOT_PASSWORD: mysqlroot  // root密码
			MYSQL_USER: ghost // 用户名 
			MYSQL_PASSWORD: ghost // 密码
		volumes: // 指定卷把数据存在本地,之前说过volumes是持久化存储,用来放数据,这样容器关闭时不会消失。
			- $PWD/data:var/lib/myql/  // 映射地址,把本地的data文件夹下的东西放入mysql服务
		ports:
			- "3306:3306"

其他常见的,上边没用到的命令
command: 覆盖镜像本身的缺省命令
// docker-compose 拉起服务,-d表示守护进程的方式执行
docker-compose up -d
// 这样就会依次创建三个服务:
// 网络名_服务名_序号
Creating ghost_db_1
Creating ghost_ghost-app_1
Creating ghost_nginx_1
// 创建的顺序是根据依赖关系来的


停止时使用
docker-compose stop
把停止的容器删除可以用
docker-compose rm
改动之后重新build
docker-compose build

// 其他命令
logs 观察各个容器的日志
ps 列出服务器相关的容器

**注意:第一次使用docker-compose up -d**时,因为没有任何镜像,所以会自动build一个。如果在后续的开发中修改了配置,要停止和删除容器。并且在重新拉起前,要手动重新build。

你可能感兴趣的:(前端工程师从初级到高级,docker)