Docker学习笔记

Docker学习笔记

hash070 408 2022-03-27

基础Docker命令

Pull命令·获取镜像

pull命令用于拉取镜像资源,在Docker Hub上有许多人类高质量镜像等你下载,下面是关于如何获取这些镜像的一些说明

从Docker镜像仓库获取镜像的命令是docker pull。

命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io)。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

Run命令·运行镜像/创建容器

有了镜像之后,我们就可以以这个镜像为基础启动并运行一个容器了。

例如启动一个乌班图系统

$ docker run -it --rm --name ubuntu:18.04 bash

root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • –name 也可以给容器指定名字(–name=[容器名称])
  • ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
  • bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash

进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 18.04.1 LTS 系统。最后我们通过 exit 退出了这个容器。

列出镜像

想要列出已下载的镜像,我们可以使用docker imgaes或docker image ls命令

img

删除本地镜像

要删除本地的镜像,我们可以使用docker image rm命令

命令格式:

$ docker image rm [选项] <镜像1> [<镜像2> ...]

其中,<镜像>可以指镜像短ID、长ID、镜像名称或镜像摘要。

Docker换源

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "features": {
    "buildkit": true
  },
  "experimental": false,
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  }
}

操作容器

启动容器

启动容器有两种方式

一种是基于镜像新建一个容器并启动

另一种是将终止状态的容器重新启动

(PS:因为Docker容器十分地轻量,所以大多数情况下我们都是随时删除和创建容器的)

新建并启动一个容器

启动容器所需要的命令主要是docker run

例如新建一个Ubuntu系统,然后进入这个系统执行一些命令

docker run -it ubuntu

img

其中-i指的是让容器的标准输入输出(IO)保持打开状态

-t指的是让Docker分配一个伪终端并绑定到容器的标准输入输出上

两个合起来就是-it了

启动已终止的容器

启动容器属于对容器(Container)的操作,所以这一类命令一般是以docker container开头的

我们可以使用docker container start命令将一个已经终止的(exited)的容器启动

例如,这里我将一个已经关闭的Ubuntu容器启动起来

img

首先对于已经退出的容器,直接使用ls命令是不会显示的,所以需要在后面添加一个-a的参数

然后使用docker container start [ID]来启动容器

这里的ID可以只写前几个字符,只要能让Docker区分开其它容器就行

守护运行容器

在大多数情况下,我们只需要让Docker在后台运行即可,不需要它输出什么东西。

可以通过添加参数-d来实现上面的这个需求(这个d应该指的是daemon)

例如在后台启动一个tomcat

img

可以通过docker run -d tomcat来实现

终止容器

我们可以使用docker container stop来终止一个容器

例如我要终止刚才启动的tomcat

img

那么我只需要使用这个命令在加上容器id或id前几个字就行了

注:终止状态的容器需要使用docker container ls -a来查看

进入容器

有些时候,我们需要进入容器内部进行一些操作,一共有两种方法

attach命令

例如:我想要进入这个tomcat容器中

首先要知道这个容器的ID,并确保该容器是启动状态

之后使用docker attach命令进入该容器

img

可以看到,如果我按下Control+C键退出的话,该容器也会被关闭

exec命令(推荐)

和上面的使用方法差不多

docker exec [参数] [容器ID] [参数]

例如

img

可以看到退出后也容器也没有关闭,所以推荐这个方法。

删除容器

#删除容器的命令(remove container)
docker rm
#删除镜像的命令(remove container image)
docker rmi

Docker 容器的数据卷

数据卷的概念和作用

Docker容器删除后,容器中产生的数据就没了,所以如何让容器中的数据持久化呢?

Docker如何和外部机器如何交换文件?

Docker容器之间如何交换文件?

这里就要用到数据卷了(Volume)

数据卷

  • 数据卷就是宿主机中的一个目录或一个文件
  • 容器中的目录可以与数据卷目录同步,双方对目录的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载/绑定

配置数据卷

  • 创建启动容器时,使用-v参数来设置数据卷
docker run ... -v 宿主机目录/文件:容器内目录/文件 ...
  • 注意事项
    1. 目录必须为绝对路径
    2. 如果目录不存在,会自动创建
    3. 可以挂载多个数据卷

示例:

宿主机中有一个/root/MyDocker文件夹,现在要把它绑定到Ubuntu容器中的/root/Data_sync目录中。

命令如下:

docker run -dit --name=d1 -v /root/MyDocker/:/root/Data_sync ubuntu

在容器和宿主机中对该目录下所有的文件操作都会被立即同步,容器删除不会导致宿主机中的文件丢失。

两个容器可以同时挂载同一个数据卷,这样可以实现容器之间的文件交换与同步。

数据卷容器

首先它是一个容器,然后它和数据卷有关,它可以实现并简化多容器对数据卷的挂载。

我们可以在创建容器时直接挂载指定数据卷,但如果有多个容器的话,操作和变更就不太方便了,这时就用到了数据卷容器了。

img

如图所示,如果我们有两个容器c1,c2想同时挂载一个数据卷,我们可以创建一个数据卷容器c3来实现这个需求。c1,c2同时挂载上c3后,就可以实现需求了。

经过上面的操作后,c1,c2实质上就等价于同时挂载上一个数据卷了,即使c3挂掉也不会影响c1和c2。

配置数据卷容器

  • 创建c3数据卷容器,使用-v参数设置数据卷
docker run -it --name=c3 -v /root/MyDocker/Volume ubuntu bash
  • 创建c1 c2容器,使用–volumes-from参数设置数据卷容器
docker run -it --name=c1 --volumes-from c3 ubuntu bash
docker run -it --name=c2 --volumes-from c3 ubuntu bash

Docker 应用部署案例

MySQL Docker部署

案例需求,在Docker中部署MySQL,能够通过外部访问MySQL Server

操作步骤

  1. 搜索MySQL镜像
  2. 拉取MySQL镜像
  3. 创建容器
  4. 操作容器中的MySQL
  • 搜索MySQL镜像
docker search mysql
  • 拉取MySQL镜像
docker pull mariadb
#MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB由MySQL的创始人Michael Widenius主导,由开源社区的大神们进行开发。性能吊打MySQL
  • 创建容器
docker run -id \
-p 3307:3306 \
--name=m1 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=helloworld \
mariadb
  1. -p 3307:3306:将容器的3306映射到宿主机的3307端口上
  2. -v $PWD/conf:/etc/mysql/conf.d:将宿主机当前目录下的conf挂载到容器上的/etc/mysql/conf.d
  3. -e MYSQL_ROOT_PASSWORD=helloworld:初始化root用户的密码

Tomcat Docker部署

拉取最新Tomcat

docker pull tomcat

部署命令

docker run -id --name=mytomcat \
-p 30002:8080 \
-v $PWD/webapps:/usr/local/tomcat/webapps \
tomcat

MongoDB部署

docker pull mongo:4.4
#这个兼容老设备

部署命令

docker run -d \
    --name mongo \
    -p 27017:27017 \
    -v /usr/local/mongo:/data/db \
    --restart always \
    mongo:4.4
或部署最新版mongo/后面的那个config可以不用
docker run --name mongo --restart=always -p 27017:27017 -v /usr/local/mongo/db:/data/db -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=yourpassword -d mongo --config /data/db/mongo.conf

Docker镜像原理

  1. Docker镜像的本质是一个分层文件系统
  2. Docker中Ubuntu的镜像比Ubunut操作系统镜像小的多的原因是:操作系统安装镜像中包含bootfs和rootfs,而Docker里的操作系统镜像只包含rootfs和少许其它镜像层。
  3. Docker中Tomcat有600多Mb,而Tomcat安装包只有不到100Mb的原因是:Docker中镜像是分层的,Tomcat安装包虽小,但它依赖于许多父镜像如操作系统、JDK等,所以大小很大。

Docker如何制作镜像

容器转镜像

代码:

docker commit [容器ID] [镜像名称]:[版本号]

DockerFile