docker
Docker
-
简介
- 开源的应用容器引擎,基于Go语言
- 完全隔离的沙箱机制,类似app之间的关系
- 重要的是性能开销极低
- 程序简化
- docker镜像中包含环境,服务环境搭建简单
-
应用场景
- web自动打包发布
- 自动化测试
- 在服务型环境中部署,调整 应用
-
Docker引擎
-
包含以下组件的客户端服务器应用程序
-
一种服务器,一种称为守护进程并长时间运行的程序
-
REST API 用于指定程序可以用来与守护进程通信的接口
-
一个有命令行界面的CLI工具的客户端
-
-
-
Docker系统架构
-
使用客户端-服务器架构模式,使用远程api来管理和创建Docker容器
-
Docker容器通过Docker镜像来创建
-
关系:容器---》对象,镜像------》类
- 镜像封装了基本的属性
- 真正操作的是容器,
-
docker pull ---->守护进程---》创建两个容器------》本机存在镜像的时候直接创建,否则到docker库下载
-
-
Docker安装
-
可以安装在windwos,mac,linux
-
前提条件
- 若为linux只适用于64位
- linux内核要大于3.10
-
一般使用脚本安装(linux环境ubuntu)
-
使用在线安装脚本
-
curl -sSL https://get.daocloud.io/docker | sh
-
执行后会下载安装包
若报错表示未更新数据源,/etc/apt/source.list 可更新为阿里云的数据源 apt-get update
-
再次执行1即可
与网络环境有关,失败再次尝试即可
或直接:sudo apt-get install -y docker.io
-
-
默认安装的是client,server
- root 可操作两个版本,普通用户只能使用client
- sudo usermod -aG docker 用户名 ,普通用户加入docker组即可(重新登陆生效或newgrp docker 生效)
-
配置加速器
-
docker镜像都在海外
-
vim /lib/systemd/system/docker.service
-
添加 --registry-mirror=https://jxus37ac.mirror.aliyuncs.com 到ExecStart
ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ac.mirror.aliyuncs.com
-
重启docker 服务
-
-
-
-
第一个Docker应用程序
-
docker run ubuntu:15.10 /bin/echo "hello Docker"
从网上下载ubuntu15.10 的镜像,创建一个容器 ,使用容器打印 “hello docker"
运行完毕就会释放
-
docker images
查看所有的镜像
-
docker ps
查看启动中的容器, -a 参数 查看所有的,包括结束的
-
docker rm containerID
删除容器,id很长,通常情况下只适用前n位也可
rmi 可删除镜像
-
docker run -it ubuntu:15.10 /bin/bash
占用主线程的交互式容器,即可进入Ubuntu容器 root命令行
-
docker run -d ubuntu:15.10 /bin/bash -c "while true:do echo hello docker;sleep 1;done"
后台运行 -d表示在后台
-
docker logs containerId
查看容器日志,加参数 -f可动态查看
-
docker stop containerId
停止容器
-
docker exec -it containerId /bin/bash
适用bash与正在运行的容器进行交互
-
-
Docker客户端
-
docker COMMAND --help
所有命令help文档
-
-
运行web容器
-
docker run -d -P training/webapp python app.py
在一个完整的操作系统上运行python程序
-P:表示把容器的端口映射到宿主机,宿主机随机一个端口映射到容器 docker ps 查看
镜像为training/webapp 它是一个flask程序
运行命令python app.py
-
可以将自己写的java等打包成容器
-
docker run -d -p 4000:5000 training/webapp python app.py
-p:可以指定访问端口 宿主机4000,容器5000
-
docker top containerId docker top names
查看容器中的进程
-
docker inspect
查看容器状态:json字符格式
-
docker 安装后会产生一个虚拟网卡,mac等,容器产生的Ip都是基于虚拟网卡的
-
docker tag containerId imageName:newTag
出现一个新的image,与上个同名,tag不同, 设置镜像标签
-
docker rm containerId1 containerId2
同时移除多个容器
-
-
Docker镜像管理
-
若使用的镜像不存在会从 Docker Hub 下载
-
docker pull tomcat docker pull tomcat:8.5.49-jdk11-openjdk
获取镜像,默认获取最新版本,也可以指定版本获取
-
docker search tomcat
查找镜像,一般选择官方的,使用docker pull name 获取,
starts 表示的是使用量,可作为评价标准
-
创建镜像
-
从已经创建的容器中更新镜像,并且提交这个镜像
-
交互式运行ubuntu,进入bash
-
apt-get update
- 可能会报错,数据源错误
- 需要修改容器内source.list
- vim 修改即可,若没有vim命令,可使用echo 命令覆盖文件
-
退出容器,此时若不提交,以上的操作下次生成容器时会重置
-
docker commit -m="has update" -a="userName" containerId newImageName:Tag(随便)
修改源镜像------》提交为一个新的镜像
-
-
使用DockerFile指令来创建镜像
-
真正的创建镜像
-
mkdir myUbuntu cd myUbuntu vi Dockerfile #(名字不要更改) FROM ubuntu:15.10 # 系统 MAINTAINER your-email COPY test.txt /home # 将宿主机的文件test.txt copy 到镜像的home下 RUN /bin/bash -c "Hello world" # 指定镜像默认执行的命令 CMD ["/bin/echo","this is param1"] # 文件中只能有一个cmd,有多个会只执行第一个 WORKDIR /home # 指定默认的工作目录 EXPOSE 80 # 暴露端口 EXPOSE 8080 docker build -t yourImageName . # 在当前目录查找dockerfile 为改文件的镜像命名
-
-
-
-
Docker实例教程
-
# 使用docker 后台运行tomcat容器 并做端口映射,并修改容器的默认名字为tomcat, docker run --name tomcat -p 8080:8080 -d tomcat # 若要在容器内tomcat 部署程序,交互式进入,写自己的html即可
-
docker pull mysql # 拉去mysql 镜像 docker run -p 3306:3306 -name mysql \ -v /usr/local/deoker/mysql/conf:/etc/mysql \ # 映射宿主机目录到容器目录 -v /usr/local/docker/mysql/logs:/val/log/mysql \ # -v 数据卷 -v /usr/local/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ # -e 指定环境边变量 -d mysql # 若以后要重新运行时,密码变更了,需要删除宿主机下原来的数据卷,否则会不生效,还使用原来的配置。
-
vim Dockerfile FROM tomcat MAINTAINER email ADD xxx.war /usr/local/tomcat/webapps/xxx.war # 添加war包到容器 docker build -t name . # 构建镜像 docker run -d -p 8080:8080 imageName # 本方式是直接将war打入本镜像,比较麻烦,可使用数据卷解决
部署项目
-
-
数据卷
-
优点
- 绕过拷贝写,修改容器内容相当于直接修改宿主机内容,性能高
- 不需要在docker commit 打包进镜像文件
- 宿主,容器,容器之间共享文件
-
创建数据卷
-
方法一
docker run -d -P -v /webapps training/webapps python app.py # 将tomcat容器的目录映射到宿主目录,即时原容器目录有内容也不可用 docker run -name tomcat1 -d -p 8080:8080 -v /usr/local/docker/tomcat/share/webapps: /usr/local/tomcat/webapps tomcat
-
方法二
dockerfile中指定 VOLUME /var/lib/test
-
-
备份数据卷
-
docker run -p 3306:3306 -name mysql \ -v /usr/local/deoker/mysql/conf:/etc/mysql \ -v /usr/local/docker/mysql/logs:/val/log/mysql \ -v /usr/local/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql # 启动数据库
-
连接容器内数据库,做出修改
-
进入宿主机的数据卷,直接备份docker/mysql目录即可
tar -zcvf backup.tar.gz .
-
-
恢复数据卷,其重新的容器时,挂载备份的文件即可
-
-
Docker Compose
-
简化docker操作的工具
-
安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 或直接下载上传即可
重命名为docker-compose,
放入环境变量目录
chown -R root:root docker-compose 赋给root
chmod +x docker-compose 加执行权限
-
docker-compose 使用
# 启用tomca容器 # 原始方法:docker run ....... # docker-compose mkdir tomcat;cd tomcat vim docker-compose.yml # yml 语言 version: "3" # compose的版本号决定 services: tomcat: # 服务名字,可变的 restart:always image:tomcat container_name:tomcat ports: - "8080:8080" docker-compose up # 此时是主线程启动 docker-compose down # 停止,并删除
-
docker-compose up -d # 后台运行 必须在docker-compose.yml所在的目录
-
version: "3" services: tomcat: restart:always image:tomcat container_name:tomcat ports: - "8080:8080" volumes: - "/usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test" environment: TZ: Asia/Shanghai
-
# mysql version: "3" services: mysql: restart: always image:mysql container_name:mysql port: - 3306:3306 environment: TZ:Asia/Shanghai MYSQL_ROOT_PASSWORD:123456 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_name=1 --max_allowed_packet=128M --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBST\ ITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATA,ERROR_FOR_DIVISION_BY_ZERO" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data: # docker安装目录/volumes/下创建mysql_mysql-data文件夹作为映射 # /var/lib/docker/volumes/mysql_mysql-data
-
-
项目部署
-
mkdir project;cd project vim docker-compose.yml version: 3 services: tomcat: restart:always image:tomcat container_name:tomcat ports: - 8080:8080 volumes: - /usr/local/docker/project/webapps/:/usr/local/tomcat/webapps/ environment: TZ: Asia/Shanghai mysql: restart: always image:mysql container_name:mysql port: - "3306:3306" environment: TZ:Asia/Shanghai MYSQL_ROOT_PASSWORD:123456 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_name=1 --max_allowed_packet=128M --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SU\ BSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATA,ERROR_FOR_DIVISION_BY_ZERO" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:
-