返回
Featured image of post Docker

Docker

Docker简单教程

Docker安装

安装Docker

系统版本:Ubuntu20.04
官方文档:https://docs.docker.com/engine/install/ubuntu/

  1. 卸载旧版本(如没有则跳过)
    sudo apt-get remove docker docker-engine docker.io containerd runc

  2. 更新apt并下载相关包

sudo apt-get update  

sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
  1. 添加Docker官方GPG key
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  2. 验证你拥有了key
    sudo apt-key fingerprint 0EBFCD88

pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) docker@docker.com
sub rsa4096 2017-02-22 [S]

  1. 使用以下命令设置稳定存储库。(这里为x86_64/amd64)
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
  1. 安装最新版Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

也可指定版本

apt-cache madison docker-ce

docker-ce | 5:18.09.1~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:18.09.0~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 18.06.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 18.06.0~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

​ 例如
sudo apt-get install docker-ce=<5:18.09.1~3-0~ubuntu-xenial> docker-ce-cli=<5:18.09.1~3-0~ubuntu-xenial> containerd.io

  1. 通过运行hello-world映像,验证Docker引擎已正确安装。
    sudo docker run hello-world
    hello-world
    hello-world
  2. 设置开机自启
    sudo systemctl enable docker
    关闭开机自启
    sudo systemctl disable docker
  3. 查看Docker运行情况
    sudo systemctl status docker

Docker的中央仓库

  1. Docker的官方仓库

https://hub.docker.com/

  1. 国内镜像仓库
  • 网易蜂巢

https://c.163yun.com/hub#/home

  • daocloud

https://hub.daocloud.io/

镜像的操作

拉取镜像

docker pull 镜像名称[:tag]

tag表示具体版本(可写可不写)

拉取tomcat环境(daocloud)
docker pull daocloud.io/library/tomcat:8.5.15-jre8

地址
地址

查看本地全部的镜像

docker images

全部镜像
全部镜像

删除本地镜像

docker rmi [IMAGE ID]

镜像的导入导出

  • 导出
    docker save -o [src] [IMAGE ID]
  • 加载
    docker load -i [镜像文件]
  • 修改镜像名称
    docker tag [IMAGE ID] [名称:版本]

容器的操作

运行容器

  • 简单语法
    docker run [IMAGE ID]|[镜像名称[:tag]]
  • 常用语法
    docker run -dit -p 宿主机端口:容器端口 --name 容器名称 [IMAGE ID]|[镜像名称[:tag]]

-d: 后台运行容器
-p: 宿主机端口:容器端口 :映射当前Linux的端口和容器的端口
–name 容器名称: 指定容器的名称

  • 运行已有容器
    docker start [container_ID]

  • 例如
    docker run -dit -p 8080:8080 --name tomcat b8

查看运行的容器

docker ps [-q|-a]

-a: 查看全部容器,包括没有运行的容器
-q: 只查看容器的标识(IMAGE ID)

查看容器的日志

docker logs -f [IMAGE ID]

-f: 可以滚动日志的最后几行

进入容器内部

docker exec -it [container_ID] /bin/bash

停止和删除容器(删除容器前需要先停止容器)

  • 停止指定的容器
    docker stop [container_ID]
  • 停止所用容器
    docker stop $(docker ps -qa)
  • 删除指定的容器
    docker rm [container_ID]
  • 删除所有容器
    docker rm $(docker ps -qa)

启动容器

docker start [container_ID]

应用Docker(以golang环境为例)

环境搭建

拉取镜像

docker pull golang

查看镜像

docker images

运行容器

docker run -dit -name golang 4a


输入docker ps发现容器已经运行

进入容器

docker exec -it 88 /bin/bash
输入go version发现环境已成功运行

退出容器

exit

停止容器

docker stop 88

在VsCode中配置环境

在VsCode中添加以下扩展

  • GO
  • Docker
  • Docker WorkSpace

设置Docker试之可以在非root用户下运行

  • 添加docker用户组
    sudo groupadd docker
  • 将登陆用户加入到docker用户组中
    sudo gpasswd -a $USER docker
  • 更新用户组
    newgrp docker
  • 重启系统即可

运行容器

docker start 88

将容器添加到VsCode工作区

  • 打开VcCode按[F1] 输入 dockerws: Add Folder to Workspace。接下来,选择docker容器,下一步, 选择要打开的文件夹路径即可。
  • 打开VsCode资源管理器,发现go已经添加到工作区

新建hello.go文件,写入测试代码

新建hello.go文件,并写入以下代码,保存。

pakage main

import "fmt"

func main(){
  fmt.Println("hello world")
}
  • 打开VsCode终端
  • 输入docker exec -it 88 /bin/bash进入容器
  • 输入go run hello.go
  • 发现输出 hello world 说明hello.go运行成功

数据卷

创建数据卷

docker volume create [数据卷名称]

默认路径 /var/lib/docker/volumes/数据卷名称
数据卷中的具体内容存放在: /var/lib/docker/volumes/数据卷名称/_data

查看数据卷的详细信息

  • 查看指定的数据卷
    docker volume inspect [数据卷名称]
  • 查看全部数据卷
    docker volume ls

删除数据卷

docker volume rm [数据卷名称]

应用数据卷

  • 当映射数据卷时,若数据卷不存在,Docker会帮你创建
    docker run -v [数据卷名称:容器内部的路径]
  • 直接指定一个路径作为数据卷的存放位置
    docker run -v [路径:容器内部的路径]

DockerFile

DockerFile是什么?

DockerFile 是构建Docker镜像的构造文件,是由一系列命令的参数构成的脚本。

DockerFile基础

  • dockerfile每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

DockerFile保留关键字

  • FROM :基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER :镜像维护者的姓名的邮箱地址
  • RUN :容器构建时需要与运行的命令
  • EXPOSE :当前容器对外暴露的端口
  • WORKDIR :指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
  • ENV :用来搭建镜像过程中设置的环境变量
  • ADD :将宿主机目录下的文件拷贝进镜像且ADD命令会自动运行URL和解压tar压缩包
  • 将从构建上下文目录中<源路径>的文件/目录复制到新一层的镜像内的<目标路径>位置COPY src dest
  • VOLUME : 容器数据卷,用于保存和持久化工作
  • CMD :指定一个容器启动时运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被的的docker run之后的参数替换
  • ENTRYPOINT :指定一个容器启动时运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。(与CMD不同的是ENTRYPOINT的参数是追加)
  • ONBUILD :当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

DockerFile案例1——自定义镜像golang

  1. 新建DockerFile文件

  2. 在DockerFile文件里写入如下内容

FROM golang  
ENV MYPATH /go/bin/  
WORKDIR $MYPATH  
EXPOSE 88  
CMD echo $MYPATH  
CMD echo "success===========ok"  
CMD /bin/bash     
  1. 打开终端输入docker build -f /home/violet/project/mydocker/DockerFile -t mygolang:1.15 .(其中-f后跟你的DockerFile文件的路径),回车

  2. 输入docker images,发现镜像已经创建成功

  3. 运行并进入容器,发现已成功设置参数

示例——安装MySQL

  1. 搜索MySQL镜像
    docker search mysql
  2. 拉取镜像
    docker pull mysql
  3. 运行镜像
    docker run -dit -p 1234:3306 -v /home/violet/project/mysql/conf:/etc/mysql/conf.d -v /home/violet/project/mysql/logs:/logs -v /home/violet/project/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass --name mysql db2b
  4. 进入容器
    docker exec -it 112 /bin/bash
  5. 运行
    mysql -uroot -p

本地镜像发布

  1. 登陆阿里云
  2. 在阿里云创建本地仓库
  3. 创建之后点击管理,进入管理页面,按照提示输入相应命令,将镜像发布


  4. 搜索镜像

docker-compsoe管理容器

下载docker-compsoe

  1. 去github官网搜索docker-compose
  2. 将docker-compose文件移到到usr/local/目录下
    sudo mv docker-compose-Linux-x86_64 /usr/local/
  3. 重命名docker-compose-Linux-x86_64文件,并给予DockerCompose文件一个可执行的权限
    sudo mv docker-compose-Linux-x86_64 docker-compose
    chmod 777 docker-compose
  4. 方便后期操作,配置一个环境变量,将docker-compose文件移动到了/usr/local/bin,修改了/etc/profile文件,给/usr/local/bin配置到了PATH中
    sudo mv docker-compose /usr/local/bin
    vi /etc/profile
    添加内容:export PATH=/usr/local/bin:$PATH source /etc/profile
  5. 在任意目录下输入docker-compose

Docker-Compose管理MySQL和Tomcat容器

  • yml文件以key:value方式来指定配置信息
  • 多个配置信息以换行+缩进的方式来区分
  • 在docker-compose.yml文件中,不要使用制表符
version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4  # 指定镜像路径
    container_name: mysql  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: root   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区
    volumes:
     - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql   # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

使用docker-compose命令管理容器

在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件

  1. 基于docker-compose.yml启动管理的容器
    docker-compose up -d

  2. 关闭并删除容器
    docker-compose down

  3. 开启|关闭|重启已经存在的由docker-compose维护的容器
    docker-compose start|stop|restart

  4. 查看由docker-compose管理的容器
    docker-compose ps

  5. 查看日志
    docker-compose logs -f

docker-compose配合Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器

  1. 编写docker-compose文件
version: '3.1'
services:
  ssm:
    restart: always
    build:            # 构建自定义镜像
      context: ../      # 指定dockerfile文件的所在路径
      dockerfile: Dockerfile   # 指定Dockerfile文件名称
    image: ssm:1.0.1
    container_name: ssm
    ports:
      - 8081:8080
    environment:
      TZ: Asia/Shanghai

  1. 编写Dockerfile文件

from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps

  1. 运行
    可以直接基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
    docker-compose up -d 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
    重新构建自定义镜像
    docker-compose build
    运行当前内容,并重新构建
    docker-compose up -d --build

错误处理

运行docker rmi [IMAGE ID]报错

  1. 错误1
    unable to delete b8dfe9ade316 (must be forced) - image is referenced in multiple repositories
    错误原因:查看镜像发现,同一个IMAGE ID被多个REPOSITORY引用
    解决方法
    docker rmi tomcat:8.5
    再次运行docker rmi [IMAGE ID]即可
  2. 错误2
    unable to delete b8dfe9ade316 (must be forced) - image is being used by stopped container fef1a1b37057
    错误原因:即要删除的该镜像,被容器fef1a1b37057所引用了
    解决方法
  • 执行docker ps -a查看所有容器记录(包括未运行的容器),并查看那些容器是使用了这个要删除的镜像
  • 执行命令docker rm container_ID删除这个容器
  • 再次运行docker rmi [IMAGE ID]即可
Licensed under CC BY-NC-SA 4.0