Docker学习笔记

学习背景

最近在折腾自己维护在github上的项目的时候,发现项目所依赖的外部环境比较多,比如zookeeper、redis、elasticsearch等等,如果都安装一遍的话比较麻烦,而且因为是自己整理平时积累用的项目,对数据也没什么要求,只要有这样一个环境能保证项目运行起来就行了。第一时间想到的就是利用docker容器部署需要的组件,这样不但自己可以学习一下,还可以把搭建成果作为这个项目的一部分让有兴趣研究的项目关注者在接触到这个项目的时候可以快速把环境搭建起来,可谓是一举两得。

有兴趣的朋友可以访问项目地址:https://github.com/MartinDai/...


安装 Docker Desktop

参考 https://www.docker.com/get-st...,安装并启动后就可以使用下面的这些命令了

docker 命令

查看docker版本

docker --version

查看当前docker版本,可以顺便验证docker是否安装成功且启动好了

查看帮助

docker --help

查看docker命令帮助,包含所有支持的操作命令使用规则及简介

还可以看某个指令的详细帮助,如:docker images --help,docker所有命令都可以在最后加上--help来查看该命令的使用帮助

镜像加速

官方镜像的下载速度不是很稳定,有时候还会超时,可以配置国内镜像来加速下载
以Mac为例,可以在Preferences页的Docker Engine设置项添加如下配置

"registry-mirrors": [
  "https://docker.mirrors.ustc.edu.cn/"
]

配置完成后点击右下角的 Apply & Restart 即可

拉取镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

下载镜像,如果没有指定镜像地址,默认从官方的hub下载指定的镜像,官方的hub提供了绝大多数热门的组件镜像,可以根据自己的需要进行搜索,这个网站有点类似github的模式,各个官方组件一般都会有比较详细的使用说明,比如Redis

可以使用docker pull redis下载最新版本的redis镜像

也可以指定下载的版本,如docker pull redis:5.0.5就可以下载5.0.5这个版本的镜像

当然有一些组件没有发布在官方的hub上,比如elasticsearch和kibana,这两个镜像需要从docker.elastic.co这个地址下载,可以使用docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.4下载

国内访问docker官方镜像有时候会超时,可以配置deamon.json使用国内的镜像网站

{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/","https://hub-mirror.c.163.com","https://registry.docker-cn.com"], "insecure-registries": ["10.0.0.12:5000"] }

查看镜像

docker images

查看当前已下载的镜像列表

查看镜像详细信息

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

举例:docker inspect 8835c0d8e1ef,表示查看ID为8835c0d8e1ef的镜像的详细信息

删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

举例:docker rmi my-image:1.0,表示删除名为my-image,版本号为1.0的镜像

使用镜像创建容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

使用指定镜像创建一个新的容器并运行,例如我们想创建运行redis容器,则可以使用命令docker run --name my-redis -p 6379:6379 -d redis,其中--namedocker run提供的参数,后面紧跟着的my-redis是对应的值,表示启动以后容器的名称,如果不指定则会使用随机生成的一个字符串。-p 6379:6379表示把本机端口6379映射到容器的6379端口,-d表示后台运行,如果不指定则启动后会自动进入容器控制台,并且退出控制台的同时会关闭容器。

容器查看

docker container ls [OPTIONS]

查看容器,可以通过docker container ls查看当前运行的容器,或者通过docker container ls -a查看所有创建的容器

删除容器

docker container rm [OPTIONS] CONTAINER [CONTAINER...]

举例:docker container rm my-container1 my-container2
表示同时删除name为my-container1my-container2的两个容器

启动容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

举例:docker start my-container1表示启动name为my-container1的容器

容器执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

对指定的容器执行命令,我们可以通过执行docker exec -it my-redis /bin/bash进入我们刚刚启动的容器

复制文件到容器

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

举例:docker cp /Users/martin/Downloads/test.txt e4cf118af140:/var/lib/dev/

其中:
/Users/martin/Downloads/test.txt为本地文件路径
e4cf118af140为容器ID
/var/lib/dev/为容器目录

复制容器文件到本地

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

举例:docker cp e4cf118af140:/var/lib/dev/test.txt /Users/martin/Downloads/

其中:
/Users/martin/Downloads/为本地路径
e4cf118af140为容器ID
/var/lib/dev/test.txt为容器文件路径

停止容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

停止容器,如果要停止上面启动的redis容器,则可以使用命令docker stop my-redis,指定了名字的好处立马就可以体现出来了,我们可以很精准的控制容器,而不需要去查询容器名称

修改容器作为新镜像

docker commit [-m] [-a] CONTAINERID REPOSITORY[:TAG]

-m 类似代码提交时的comment信息
-a 指定修改者信息
CONTAINERID 用来创建镜像的容器ID
REPOSITORY[:TAG] 目标镜像的仓库名和tag信息

创建成功后会生成新的镜像ID

举例:docker commit -m "add something" -a "Martin Dai" e4cf118af140 my-image:latest

推送镜像到远程

docker push REPOSITORY[:TAG]

举例:docker push my-image:latest

基于容器导出镜像

docker export [OPTIONS] CONTAINER

举例:docker export -o my-image.tar my-container,表示把name为my-container的容器导出到my-image.tar文件

导入镜像

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

举例:docker import my-image.tar my-image:1.0,表示导入文件my-image.tarmy-image:1.0镜像

保存镜像

docker save [OPTIONS] IMAGE [IMAGE...]

一般用于需要使用镜像的机器无法直接通过地址拉取到镜像的时候,可以在某台可以拉取到镜像的机器上先把镜像拉下来,然后保存为压缩文件传输到目标机器,最后通过下面介绍的load方式加载镜像

举例:docker save -o my-image-1.0.tar.gz my-image:1.0 ,表示把镜像my-image:1.0的保存为my-image-1.0.tar.gz文件

加载镜像

docker load [OPTIONS]

举例:docker load < my-image-1.0.tar.gz,表示加载文件名为my-image-1.0.tar.gz的镜像

重新给镜像打tag

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

举例:docker tag my-image:1.0 my-image:1.1,表示把镜像my-image:1.0的tag改为my-image:1.1
docker tag 9662176f98f9 my-image:1.1,表示把ID为9662176f98f9的镜像tag改为my-image:1.1

docker-compose 命令

有时候项目依赖的外部环境比较多,但是又不想一个一个启动各个容器怎么办呢,docker-compose就是用来解决这个问题的,该命令可以通过使用指定的yml同时启动多个容器。

假如我们现在有个yml(具体yml规则可参考官方文档),且文件名为docker-compose.yml

version: '3.7' #标识docker-compose的版本,不同版本所支持的配置项有些不一样
services: #服务(也就是各个容器)配置
  redis: #服务名称,用于配置文件内关联使用
    image: redis:5.0 #镜像版本
    container_name: redis #容器名称
    command: redis-server /etc/redis/redis.conf #启动后执行的命令
    restart: always #启动失败是否重启
    volumes: #路径扩展映射配置
          - ./redis/:/etc/redis/ #把当前目录下的redis文件夹映射到容器中的/etc/redis文件夹,这样就可以在容器之外维护配置文件了
    ports: #端口映射配置
      - 6379:6379 #把本地的6379端口映射到容器的6379端口
    networks: #网络配置
      - net-cache
  memcached:
    image: memcached:1.5
    container_name: memcached
    restart: always
    ports:
      - 11211:11211
    networks:
      - net-cache
networks:
  net-cache:
    driver: bridge #配置桥接网络

进入该文件所在的目录,然后执行docker-compose up就可以启动redis和memcached这两个容器,如果要使用其他文件名,则可以使用-f参数来指定文件名,如docker-compose -f docker-compose-cache.yml up,如果需要后台运行,则可以在最后加上-d

有启动就有停止,如果想要停止docker-compose up启动的容器,可以执行docker-compose down命令停止所有组合的容器。

你可能感兴趣的:(docker)