day02 docker

docker是什么?

为了解决不同组件部署的冲突问题,docker应运而生。

docker放在linux系统中,可以部署许多的组件如mysql,redis等,每个都有自己的运行环境,不会互相干扰。

Docker和虚拟机的区别

虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:

day02 docker_第1张图片

Docker架构概念

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

 docker基础命令

systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

docker -v 查看版本号

docker基本操作

docker pull mysql:5.7    拉取mysql版本为5.7数据库命令

docker images 查看拉取到的镜像

docker ps -a 查看所有运行的容器

docker logs -f     -f是持续查看日志

docker save -o nginx.tar nginx:latest 将nginx版本为latest的镜像导出到磁盘中命名为nginx.tar

docker rmi nginx:latest 删除镜像 nginx版本为latest

docker load -i nginx.tar 加载本地文件(导入镜像)

容器操作指令

  • docker run:创建并运行一个容器,处于运行状态                                                                   例子:docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器

  • --name : 给容器起一个名字,比如叫做mn

  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口

  • -d:后台运行容器

  • nginx:镜像名称,例如nginx

以下命令后面直接跟容器名或者id

  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

进入容器

docker exec -it mn bash 进入mn中

挂载:

解释:本来要进入到容器内才能进行操作,现在通过挂载的方式可以不用进入容器就能操作了。

目录挂载的命令:

1.数据卷挂载

基础命令:

  • docker volume create:创建数据卷

例子:docker volume create html 创建html数据卷

  • docker volume ls:查看所有数据卷

  • docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置

  • docker volume rm:删除指定数据卷

  • docker volume prune:删除所有未使用的数据卷

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:

创建容器并挂载数据卷到容器内的HTML目录

docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx:1.14.1

这里的-v就是挂载数据卷的命令:

  • -v html:/usr/share/nginx/html :把html数据卷挂载到容器内的/usr/share/nginx/html这个目录中

冒号左边的是宿主机的,由docker自己管理。

冒号右边的是容器的地址路径;

 

2.直接挂载

例:

拉取镜像:
    docker pull mysql:5.6
进入tmp目录,创建/tmp/mysql/data和/tmp/mysql/conf
  mkdir -p /tmp/mysql/data   // 存放生成的数据信息
  mkdir -p /tmp/mysql/conf   // 存放共享的配置文件信息
将课程资料中的hmy.cnf配置文件拷贝到/tmp/mysql/conf

 创建mysql容器,并绑定对应的文件夹和文件:
  docker run \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -p 3306:3306 \
  -d \
  -v /tmp/mysql/data:/var/lib/mysql \
  -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/my.cnf \
  --privileged \
  mysql:5.7
---------------------
  docker run \   // 创建容器
  --name mysql \ // 给容器起名
  -e MYSQL_ROOT_PASSWORD=root \ // 设置root账户密码
  -p 3306:3306 \ // 端口映射
  -d \ // 后台运行
  -v /tmp/mysql/data:/var/lib/mysql \ // 绑定宿主机上的文件夹
  -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/my.cnf \ // 绑定宿主机上的文件
  --privileged \ // 设置超级管理员远程访问权限
  mysql:5.7 // 镜像名称

 Dockerfile自定义镜像

命令:

day02 docker_第2张图片

更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Documentation

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

  • ① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

  • ② 拷贝课前资料提供的项目jar包docker-demo.jar导入到这个目录中

  • ③ 编写Dockerfile文件:

    • a )基于java:8-alpine作为基础镜像

    • b )将app.jar拷贝到镜像中

    • c )暴露端口

    • d )编写入口ENTRYPOINT

      内容如下:

  • FROM java:8-alpine
    COPY ./app.jar /tmp/app.jar
    EXPOSE 8090
    ENTRYPOINT java -jar /tmp/app.jar

④ 使用docker build命令构建镜像

docker build -t javaweb:1.0 .

 ⑤ 使用docker run创建容器并运行

 docker run --name web -

p 8090:8090 -d javaweb:1.0

 

Docker-Compose

说明:Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

编写Dockerfile

(1)在任意位置创建一个新目录,将app.jar复制到该目录

(2)在该目录中,新建一个Dockerfile文件,并编写下面的内

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 9090
ENTRYPOINT ["java","-jar","/tmp/app.jar"]

 

编写docker-compose

在刚才的目录中,创建一个docker-compose.yml文件并填写内容:

version: '3'
services:
  web:
    build: .
    ports:
      - "9090:9090"
  redis:
    image: "redis:6.0"

 

命令解读:

  • version:compose的版本

  • services:服务列表,包括两个服务:

    • web:自己写的Java项目

      • build:这个服务镜像是临时构建的,构建目录是当前目录,会利用当前目录的Dockerfile来完成构建。

      • ports:端口映射,对外开放8080端口

    • redis:redis服务

将刚刚准备好的文件夹上传到Linux的对应的/docker-compose目录:

然后执行命令:

docker-compose up -d

 通过docker-compose stop 关闭容器

通过docker-compose down关闭容器并删除

你可能感兴趣的:(docker,容器,运维)