docker入门详解

简述

  Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker对软件跨环境迁移问题提供了一个很好的解决方案。

安装docker

  笔者使用的是windows系统,因为docker是部署在linux的,所以我们要在window配置虚拟机,详细安装教程:

https://www.runoob.com/docker/windows-docker-install.html

  安装完可以在命令行使用docker run hello-world命令检测是否运行成功,在成功运行之后应该会出现以下信息:

docker架构

  docker包含三个基本概念:

  镜像:Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统

  容器:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等

  仓库:仓库可看成一个代码控制中心,用来保存镜像。

docker的镜像加速 

  国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器

  在 Registrymirrors 一栏中填写自己的加速器地址即可(可以去阿里云自己配置) 

docker常用命令

docker run [options] <image name>|<id> [command] 运行命令
docker ps 查看当前运行的容器
docker ps -a 查看所有容器
docker rm 容器id 删除容器
docker images 查看镜像
docker run 镜像名 将命令封装到镜像中
docker logs <container name> 查看容器的日志
docker start <container name> 启动容器
tldr docker 查看docker常用的几个命令

  docker run的常用options有

-d 后台运行,指日志信息不输出在当前控制台
--name 为容器起名

docker持久化

  当容器关闭的时候,数据也就清空了,这时就需要持久化的操作

  提供独立于容器之外的持久化存储,有两种方式:Bind Mounting和Data Volume

  Bind Mounting和虚拟机的共享文件夹类似,就是将本地目录和虚拟目录进行一个映射的操作

  具体使用方法为run命令后跟着 -v 参数,然后指定两个文件的映射

docker run -d --restart=always --name mysqltest -p 3310:3306 \ 
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf:/etc/mysql \
-v /home/mysql/log:/var/log/mysql

  例如此处对三个目录进行了挂载

docker容器镜像的清理

  使用docker system的相关命令可以查看docker的全局信息

  查看docker应用的全局信息:容器、镜像的状态,给docker分配的资源

docker system info

  查看空间使用情况

docker system df

  删除所有退出状态的容器

docker container prune

  删除未使用的数据卷

docker volume prune

  删除所有未被使用的镜像

docker image prune

docker file

  docker的最大用处就是构建自己的docker镜像,然后部署

  在项目里可以直接手动创建Dockerfile文件,没有后缀,名字也是固定的

# 使用JDK8环境作为基础镜像
FROM java:8

# 拷贝JRA包
COPY build/libs/生成的jar包名 app.jar

# 容器启动时执行
ENTRYPOINT ["java","-jar","/app.jar"]

# 暴露端口
EXPOSE 8080

  然后使用build命令就能生成该应用的镜像

docker build -t 镜像名:tag名

推送镜像到docker hub

  当想让自己的镜像部署在别的机器上的时候,我们就可以和git操作一样推送自己的镜像至远端仓库

  首先我们可以对镜像进行重标记,目的是加上id名,保证镜像在docker hub的唯一性

docker tag 镜像名:tag 个人id/镜像名:tag

  然后我们就能将本地镜像推送到docker hub了

docker login # 登录docker hub
docker push id/镜像名:tag # 推送镜像
docker logout #登出docker hub

docker compose文件

  对于多容器组成的项目,容器之间想要互相调用,就需要docker-compose的帮助了

  对于一系列想执行的命令,我们可以把命令都写在docker-compose.yml文件里

  然后使用 docker-compose up 和 docker-compose down 完成整个application的启和停

version: '3'

services:
  alice: #容器名
    build: alice #容器内DockerFile的目录
    image: alice:1.0 #镜像名及版本号
    container_name: alice #运行的容器名
    ports:
      - '8088:8080' #端口映射
    depends_on: #容器之间的依赖,指定bob代表alice会在bob之后启动
      - bob
  bob:
    build: bob
    image: bob:1.0
    container_name: bob
    ports:
      - '8081:8081'

  这里的alice和bob都是项目的模块,每个模块都有DockerFile

  配置项的build内容就是指定模块中DockerFile的目录

  如果项目想要用到外部容器,例如mysql,可以在docker-compose中增加配置项

version: '3'
services:
  mysql:
    restart: always
    image: mysql:5.7.18
    container_name: mysql-lable
    volumes:
      - /apps/mysql/mydir:/mydir
      - /apps/mysql/datadir:/var/lib/mysql
      - /apps/mysql/conf/my.cnf:/etc/my.cnf
      # 数据库还原目录 可将需要还原的sql文件放在这里
      - /apps/mysql/source:/docker-entrypoint-initdb.d
    environment:
      - "MYSQL_ROOT_PASSWORD=yourpassword" #mysql的密码
      - "MYSQL_DATABASE=yourdbname" #mysq的用户名
      - "TZ=Asia/Shanghai" #时区
    ports:
      # 使用宿主机的3306端口映射到容器的3306端口
      # 宿主机:容器
      - 3306:3306

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2021-08-03 16:36  艾尔夏尔-Layton  阅读(240)  评论(0编辑  收藏  举报