Docker是个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Dcoker的相关概念

打包:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包

分发:你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装

部署:拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux。

镜像:相当于软件安装包,方面传播与安装

容器:软件安装后的环境,每个软件运行环境都是独立且隔离的

安装

Dcoker 安装

桌面版https://www.docker.com/products/docker-desktop

服务器版https://docs.docker.com/engine/install/#server

采用命令行安装Linux子系统

wsl --install -d Ubuntu
# 安装docker时一般会自动安装wsl,这步可跳过

设置开机启动Hypervisor

bcdedit /set hypervisorlaunchtype auto

安装软件

安装redis

首先在Docker 官方镜像仓库查找 Redis :https://hub.docker.com/

下载镜像:

docker pull redis

通过一条命令运行这个软件

docker run -d -p 6379:6379 --name redis redis:latest
# -d: 在后台运行容器并打印容器ID
# -p: 将容器的端口发布到主机

image-20220228152609227

命令参考:https://docs.docker.com/engine/reference/commandline/run/

在docker的桌面版客户端可以看到redis正在运行

image-20220228153524900

点进去可以在终端查看这个应用

image-20220228153937328

使用docker-compose安装wordpress

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

将以上yml文件保存命名为docker-compose.yml

通过命令运行这个文件

docker-compose up -d

image-20220228155245874

在桌面应用中查看

image-20220228155503124

在本地尝试访问

image-20220228155600380

使用Dockerfile构建镜像

以创建Ubuntu镜像为例

Dcokerfile文件:

FROM ubuntu:18.04   #指定以ubuntu:18.04为基础镜像
MAINTAINER Ike Dong “ds1024@foxmail.com”    #设置作者信息
RUN apt update  #更新apt源,RUN指令支持shell语法
RUN ["apt","install","-y","tree"]   #安装tree,RUN指令支持exec语法
RUN apt install -y nginx    #安装nginx
RUN echo "Hello World,I am Ike" > /var/www/html/index.nginx-debian.html    #修改nginx首页信息
CMD ["nginx","-g","daemon off;"]  #设置nginx前台运行,CMD指令支持exec语法
EXPOSE 80   #开放端口

通过docker build命令构建镜像,该命令需要在dockerfile文件所在目录下执行

docker build -t="ikedong/dockerfile-demo:1.0" .
# -t:指定镜像名字及版本号
# .: 设置在当前目录

image-20220228162102404

在桌面版客户端中也可以查看到该镜像

image-20220228162146621

下面通过创建该镜像容器来验证

docker run -d -p 4444:80 --name dockerfile-demo ikedong/dockerfile-demo:1.0

image-20220228162553818

访问4444端口可以看到在dockerfile中添加的信息

image-20220228162710151

Dcoker挂载目录

Docker运行后,我们修改的项目代码不会立刻生效,需要重新build和run。容器里面产生的数据,例如log文件,数据库备份等,在容器删除后会丢失。

通过挂载目录可以解决以上问题

挂载目录 bind mount

bind mount,直接把宿主机目录映射到容器内,适合挂在代码目录和配置文件,可挂载到多个容器上。

这个方法采用绝对路径-v D:/code:/app

例:

docker run -p 8080:80 -name test -v D:code:/app test:1.0

挂载目录 volueme

volume,由容器创建和管理,创建在宿主机上,删除容器后不会丢失,官方推荐,采用linux文件系统,适合存储数据库数据,可挂载到多个容器上

只需要一个名字即可-v db-data:/app

例:

docker run -p 8080:80 -name test -v db-data:/app test:1.0

挂载目录 tmpfs mount

tmpfs mount,适合存储临时文件,存储在宿主机内存中,不可多容器共享

需要参数--tmpfs /app

例:

docker run -p 8080:80 -name test --tmpfs /app test:1.0

多容器通信

项目往往不是独立运行的,所以需要多个容器相互通信协作

创建虚拟网络

想要多容器通信,著需要将容器放在同一个网络中

创建一个名为Test-Net的网络

docker network create Test-Net

运行Redis在Test-Net网络中,别名为redis

docker run -d --name redis --network Test-Net --network-alias redis redis:latest

修改代码中访问redis的地址网络名称

img

运行Web项目,使用同一网络

docker run -p 8080:8080 --name test -v D:/test:/app --network Test-Net -d test:v1

在容器终端查看数据是否一致:http://localhost:8080/redis

Dcoker-Compose

如果项目需要依赖很多第三方软件,我们只需要采用docker-compose,就可以无需单独配置每个容器的配置

桌面版的Docker集成的docker-compose,服务器版的Docker需要单独安装,参考:https://docs.docker.com/compose/install/#install-compose-on-linux-systems

将多个项目集合在一起,我们需要编写一个docker-compose.yml文件

参考:https://docs.docker.com/compose/

version: "3.7"

services:
  app:
    build: ./
    ports:
      - 80:8080
    volumes:
      - ./:/app
    environment:
      - TZ=Asia/Shanghai
  redis:
    image: redis:5.0.13
    volumes:
      - redis:/data
    environment:
      - TZ=Asia/Shanghai

volumes:
  redis:

使用命令docker-compose up即可运行起来