Docker的安装及其日常使用

安装

Ubuntu安装

  1. sudo apt update - 更新软件包
  2. sudo apt -y install apt-transport-https ca-certificates curl software-properties-common - 安装可能用到的依赖
  3. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - - 添加阿里云源的密钥
  4. sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" - 添加阿里云源信息
  5. sudo apt update - 更新索引库
  6. sudo apt-get remove docker docker-engine docker.io - 如果存在docker需要先删除
  7. sudo apt install docker-ce - 安装docker

Centos安装

  1. uname -r - 查看内核版本(centos7 64位要求3.10+,centos6 64位要求2.6+)
  2. yum update - 更新底层库文件
  3. yum erase -y docker docker-common docker-engine - 移除可能存在的旧版docker
  4. yum install -y yum-utils device-mapper-persistent-data lvm2 - 安装工具包和依赖项
  5. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 添加docker-ce源
  6. yum makecache fast - 做本地缓存,加快安装速度
  7. yum -y install docker-ce - yum安装docker
  8. systemctl start docker - 启动docker
  9. systemctl enable docker - 设置开机自启动

配置

配置主要就是更换docker源

Linux下更改国内镜像在/etc/docker/daemon.json中添加以下代码

1
2
3
4
5
6
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}

daocloud也可以下载镜像,且有较详细的配置参数

配置私服拉取镜像

1
2
3
4
5
6
7
# /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["ip:port"]
}
# systemctl daemon-reload
# systemctl restart docker

也可以访问阿里云镜像服务,注册后获取镜像加速地址

命令

普通命令

  • docker version - 查看docker版本
  • docker info - 查看详细信息
  • docker network create isolated - 创建docker网络

镜像管理

  • docker pull 镜像名 - 下载镜像
  • docker images - 查看所有本地的镜像
  • docker search 镜像名 - 查找镜像
  • docker rmi 镜像id/镜像名 - 删除镜像
  • docker save -o 导出的路径 镜像id - 导出镜像到文件
  • docker load -i 镜像文件 - 加载本地到镜像文件
  • docker tag 镜像id 镜像名:镜像版本 - 重命名镜像
  • docker tag 旧镜像名:旧版本 新镜像名:新版本 - 复制一个镜像
  • docker push 地址名/仓库名/镜像名:版本名 - 推送镜像

容器管理

  • docker run -d -p 80:80 --name mynginx --rm nginx:latest [command] - 创建并运行容器,

    • -d - 后台运行
    • -i - 启动一个可交互的容器,并持续打开标准输入
    • -t - 终端关联到容器的标准输入输出上
    • -p port1:port2 - 指定端口 外部端口:内部端口
    • -v/--volume 外部文件夹:内部文件夹 - 数据卷操作,将外部文件夹映射到容器内部文件夹
    • --link 容器名:自定义网络别名 - 给容器网络设置别名
    • --name 容器名字 - 给创建的容器命名
    • -e 环境变量名=环境变量值 - 设置容器全局变量
    • --rm - 为停止容器的时候容器自动删除
    • 镜像名:版本号 - 指定镜像和版本,latest为最新版本,默认不写也为最新版本
    • command - 表示运行容器时的启动命令
  • docker ps [-qa] - 查看正在运行到容器

    • -q - 只查看容器到标识
    • -a - 查看全部到容器,包括未运行到容器
  • docker logs -f 容器id - 查看容器到日志

    • -f - 可以滚动到查看日志到最后几行
  • docker exec -it 容器ID/容器名 bash - 进入到容器内部命令行

  • docker stop 容器名称/容器id - 停止正在运行的容器

  • docker stop $(docker ps -qa) - 停止所有的容器

  • docker rm -f 容器id - 删除容器

    • -f - 强制删除容器(包括正在运行的容器)
  • docker start 容器名称 - 运行已经创建的容器

  • docker restart 容器名称 - 重启正在运行的容器

  • docker cp 文件名 容器id:容器内部路径 - 拷贝文件到容器中

  • docker container ls -a - 查看所有的容器,不加-a表示正在运行的容器

  • docker container prune - 清空所有容器

  • docker inspect 容器id - 获取容器底层信息

    • IPAddress - ip地址

数据卷

  • docker volume create 数据卷名称 - 创建数据卷

    • 创建数据卷之后,默认会存放在/var/lib/docker/volumes/数据卷名称/_data
  • docker volume inspect 数据卷名称 - 查看数据卷详细信息

  • docker volumes ls - 查看全部数据卷

  • docker volumes rm 数据卷名称 - 删除数据卷

  • docker run -v 数据卷名称:容器内部路径 镜像id - 映射数据卷,会自动复制容器的文件到宿主机文件夹

  • docker run -v 宿主机路径:容器内部路径 镜像id - 直接指定一个路径作为数据卷的存放地址,这个地址是空的

自定义docker镜像

  1. 创建一个Dockerfile文件,并指定自定义镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #: 注释,指令大小写不敏感,但是建议指令大写,内容小写
    FROM: 指定当前自定义镜像依赖的环境,dockerfile第一条非注释的命令必须是from
    COPY: 将相对路径下的内容复制到镜像中
    ADD: 将文件写入到镜像中(和copy的区别是copy是运行镜像时拷贝文件,add是构建镜像时拷贝进入)
    WORKDIR: 生命镜像到默认目录
    USER: 镜像中的启动用户名
    RUN: 构建镜像时执行命令
    ENV: 指定镜像中的环境变量
    CMD: 需要执行的命令(在workdir下执行,可以写多个,以最后一个为准)
    ENTRYPOINT: 如果dockerfile中没有run命令,则运行镜像中 /entrypoint.sh 文件,注意需要给执行权限
    ARG: 用于指定传递给构建运行时的变量
    EXPOSE: 指定于外界交互的端口
    LABEL: 用于为镜像添加元数据
    maintainer: 维护者信息
    version: 版本信息
  2. 制作镜像docker build -t 镜像名称:[tag] .

    • -t - 指定版本
    • . - 表示将当前目录下的文件编译为镜像
  3. docker commit和docker build的区别

    docker commit 容器id 自定义镜像名字 - 将容器打包成镜像
    docker build -t 镜像名称:[tag] . - 通过dockerfile创建镜像

Docker-compoes

  1. 下载docker-compose文件,直接从github下载对应文件,修改文件的可执行权限并配置环境变量即可使用
  2. 编写docker-compose.yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'          # 指定版本号,该配置为固定配置,根据不同的docker-compose决定
services:
mysql: # 服务的名称
restart: always # 表示只要docker启动了,容器就一起启动
image: mysql:5.7 # 指定镜像
continer_name: mysql # 指定容器的名称
ports:
- 3306:3306 # 指定端口号映射
envirement: # 指定环境变量
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Shanghai
volumes:
- ~/volumes/mysql/data:/var/lib/mysql # 指定数据卷

推送镜像到阿里云

  1. 首先在阿里云创建命名空间,相当于仓库名
  2. docker login --username=王大锤 registry.cn-hangzhou.aliyuncs.com 本地登录阿里云
  3. docker tag 旧镜像名:旧版本 新镜像名:新版本 修改镜像名称
    注意:新镜像名需要按照:阿里云地址/阿里云创建到命名空间/自定义名称或者阿里云创建的仓库名:版本的格式
  4. docker push 新镜像名:版本号推送到阿里云镜像仓库
  5. docker pull 新镜像名:版本号将远端到镜像拉到本地

常见容器创建命令

docker run -d -p 6379:6379 --name redis-master redis:latest redis-server --requirepass 1qaz2wsx - 创建一个redis容器并设置密码为1qaz2wsx

docker run -d -p 6380:6379 --link redis-master:redis-master --name redis-slave-1 redis:latest redis-server --slaveof redis-master 6379 --masterauth 1qaz2wsx - 创建一个redis从机容器,并关联名称为redis-server的主机

docker run -d -p 3306:3306 -v /root/docker/mysql/conf:/etc/mysql/mysql.conf.d -v /root/docker/mysql/data:/var/lib/mysql --name mysql57 -e "MYSQL_ROOT_PASSWORD=123456" mysql:5.7.29 - 创建一个MySQL的容器设置数据库密码为123456并将做数据备份

常见故障

docker启动后命令无法使用

报错:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied

原因:docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。

解决办法:

  1. 获取root权限使用docker
  2. docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
1
2
3
4
sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用