Docker基础

88 阅读10分钟

简介

和原系统共用内核

必须部署在linux

三要素

镜像

同一个镜像文件,可以生成多个运行的容器实例

镜像是只读的

虚悬镜像

仓库名、标签都是<none>的镜像,俗称虚悬镜像(dangling image)。

容器

容器是镜像的运行时

容器是可读可写的

仓库

存放镜像的地方

安装

gcc

yum -y install gcc
yum -y install gcc-c++

yum依赖

sudo yum install -y yum-utils

设置引擎下载地址

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

慢的话设置阿里地址 mirrors.aliyun.com/docker-ce/l…

更新yum软件索引

yum makecache fast

下载引擎

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

启动

systemctl start docker

仓库换源

容器镜像服务 (aliyun.com)

根据操作文档完成配置

卸载

卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

卸载docker

 sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

常用命令

docker

启动

启动

systemctl start docker

重启

systemctl restart docker

自启

systemctl enable docker

停止

systemctl stop docker

帮助

状态

systemctl status docker

概要

docker info

总体文档

docker --help

命令文档

docker 命令 --help

镜像

本机镜像

docker images

参数:

  • -a:列出所有镜像(含历史镜像)
  • -q:只显示镜像ID
  • -f:过滤

搜索镜像

docker search 镜像名称

参数:

  • -f:过滤,字母用一个(-)
  • --limit 数量:只展示前几项,单词用两个(-)

下载镜像

docker pull 镜像名称[:tag]

不加 tag 时,默认下载最新的镜像(即tag为latest)。

占据的空间

docker system df

删除镜像

单个

docker rmi 镜像名称/ID

多个

docker rmi 镜像1 镜像2 镜像3

全部

docker rmi -f ${docker images -qa}
  • -a:列出所有镜像(含历史镜像)
  • -q:只显示镜像ID

强制删除

当对应的容器在使用时,镜像不能删除,需要使用强制删除

docker rmi -f 镜像名称/ID 

生城镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]

Docker挂载主机目录,可能会出现报错:cannot open directory .: Perission denied

解决方案:在命令中加入参数 --privileged=true

CentOS7安全模块比之前系统版本加强,不安全的会先禁止,目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了。如果要开启,一般使用 --privileged=true,扩大容器的权限解决挂载没有权限的问题。也即使用该参数,容器内的root才拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。

推送/拉取镜像

按照阿里云仓库脚本提示

流程和git差不多

启动镜像

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

常用的参数:

  • --name:为容器指定一个名称 --name=hh
  • -d:后台运行容器并返回容器ID,也即启动守护式容器
  • -i:以交互模式(interactive)运行容器,通常与-t同时使用
  • -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
  • -e:为容器添加环境变量
  • -P(大写):随机端口映射
  • -p:指定端口映射

-p指定端口映射的几种不同形式:

  • -p hostPort:containerPort:端口映射,例如-p 8080:80
  • -p ip:hostPort:containerPort:配置监听地址,例如 -p 10.0.0.1:8080:80
  • -p ip::containerPort:随机分配端口,例如 -p 10.0.0.1::80
  • -p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306

直接启动的容器,启动完成后就会被回收

交互式前台容器

docker run -it ubuntu /bin/bash
  • -i:以交互模式(interactive)运行容器,通常与-t同时使用
  • -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
退出
exit
# 在容器中exit即可退回宿主机
exit;

容器会停止

关闭终端

使用快捷键ctrl + P + Q(有序)或手动关闭终端

容器依然正在运行

交互式后台容器

docker run -id ubuntu /bin/bash
  • -i:以交互模式(interactive)运行容器,通常与-t同时使用
  • -d:后台运行容器并返回容器ID,也即启动守护式容器
退出
exit
# 在容器中exit即可退回宿主机
exit;

容器依然正在运行(注意与交互式前台容器区分)

关闭终端

使用快捷键ctrl + P + Q(有序)或手动关闭终端

容器依然正在运行

容器

历史

docker ps [OPTIONS]

常用参数:

  • -a:列出当前所有正在运行的容器+历史上运行过的容器
  • -l:显示最近创建的容器
  • -n:显示最近n个创建的容器
  • -q:静默模式,只显示容器编号

启动

docker start 容器ID或容器名

进入

交互式前台容器、交互式前后容器的进去区别都是一样的

attach

docker attach 容器ID

直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止

如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。

exec

docker exec -it 容器ID /bin/bash

是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止

重启

docker restart 容器ID或容器名

停止

docker stop 容器ID或容器名

强制停止

docker kill 容器ID或容器名

删除

删除已停止容器

docker rm 容器ID或容器名

删除正运行容器

docker rm -f 容器ID或容器名

批量删除

docker ps -a -q | xargs docker rm

内部

日志

docker logs 容器ID或容器名

进程

docker top 容器ID或容器名

细节

docker inspect 容器ID或容器名

文件拷贝

容器到宿主机

docker cp 容器ID:容器内路径 目的主机路径

宿主机到容器

docker cp 主机路径 容器ID:容器内路径

导入导出

# 导出
# docker export 容器ID > tar文件名
docker export abc > aaa.tar
​
# 导入
# cat tar文件 | docker import - 自定义镜像用户/自定义镜像名:自定义镜像版本号
docker aaa.tar | docker import - test/mytest:1.0.1

私库

搭建

通过registry镜像可以创建带有私库功能的容器

下载镜像

docker pull  registry

启动镜像

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

/zzyyuse/myregistry/:/tmp/registry指定容器卷,方便联调。默认情况下,仓库会被创建在容器的/var/lib/registry目录下。冒号左边是宿主机路径,右边是容器内路径

privileged

centos7安全模块加强,目录挂载认为是不安全行为

--privileged=true:容器内的root用户拥有真正的root权限

配置

docker默认不允许http推送镜像

修改/etc/docker/daemon.json,添加insecure-registries允许http

{
    "registry-mirros": ["https://xxxx.mirror.aliyuncs.com"],
    "insecure-registries": ["127.0.0.1:5000"] // 本机5000端口允许http推送镜像
}

然后重启docker:(新版本的docker会立即生效)

# centos7 的命令
sudo systemctl daemon-reload
sudo systemctl restart docker

推送规范

docker tag   lee/myubuntu:1.0.1   192.168.xxx.xxx:5000/lee/myubuntu:1.0.1

192.168.xxx.xxx:5000仓库ip端口号

推送

docker push 192.168.xxx.xxx:5000/lee/myubuntu:1.0.1

拉取

docker pull 192.169.xxx.xxx:5000/lee/myubuntu:1.0.1

自动补全

docker支持命令自动补全功能,当输入镜像名前几位时,可以按tab键自动补全镜像名称、tag等。

容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。

特性:卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点

  • 数据卷可以在容器之间共享或重用数据
  • 卷中的更改可以直接实施生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

绑定

docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[:rw | :ro] 镜像名
docker run -it --privileged=true  -v /tmp/test:/tmp/docker:ro --name u1 ubuntu /bin/bash

权限:

  • rw:读写 (默认)
  • ro:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取。

查看绑定

docker inspect 容器id

inspect:以json形式返回容器的信息,Mouts属性就包含容器卷的绑定信息

继承

一个容器的容器卷可以继承另一个容器的容器卷

# 启动一个容器
docker run -it --privileged=true /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash
​
# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

--volumes-from u1:继承u1的容器卷挂载规则

容器软件安装

搜索镜像、拉取镜像、查看镜像、启动镜像、停止容器、移除容器

容器版本的使用详情可以在Docker Hub Container Image Library | App Containerization查看基本的参数信息,包括用户和密码等

tomcat

搜索镜像(docker search tomcat)、拉取镜像(docker pull tomcat)、查看镜像(docker images tomcat)、启动镜像(docker run -it -p 8080:8080 tomcat)、停止容器、移除容器

tomcat10容器版中webapps没有文件,默认文件放在了webapps.dist文件中,需要删除webapps将webapps.list改为webapps。docker exec -it 256efb17fdbe /bin/bash登录tomcat,rm -r webapps删除webapps,mv webapps.dist webapps将webapps.list改为webapps。打开http://localhost:8080即可看见默认网页

mysql

拉取镜像(docker pull mysql:5.7)、启动镜像(docker run -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7)进入mysql(docker exec -it a18c035939b1 /bin/bash)、登录mysql(mysql -uroot -p)

-e MYSQL_ROOT_PASSWORD=123456:指定mysql root用户的密码,docker可以直接启动某个镜像,现在本地寻找,再去远端寻找

中文乱码

在容器mysql5.7中character_set_databasecharacter_set_server等都为latin1字符集,所以会报错,先映射容器卷,然后

cd /zzyyuse/mysql/conf
vim my.cnf

输入

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

重启容器

docker restart mysql

容器卷

docker run -d -p 3307:3306 \
           --privileged=true \
           -v /zzyyuse/mysql/log:/var/log/mysql \
           -v /zzyyuse/mysql/data:/var/lib/mysql \
           -v /zzyyuse/mysql/conf:/etc/mysql/conf.d \
           -e MYSQL_ROOT_PASSWORD=123456 \
           --name mysql \
           mysql:5.7

/var/log/mysql:MySQL日志文件夹、/var/lib/mysql:Mysq数据库文件夹、/etc/mysql/conf.d:配置文件夹

redis

容器卷启动

1.宿主机创建目录/app/redis

2.在/app/redis下创建文件redis.conf,主要修改以下几项配置

# 开启密码验证(可选)
requirepass 123

# 允许redis外地连接,需要注释掉绑定的IP
# bind 127.0.0.1

# 关闭保护模式(可选)
protected-mode no

# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

# 开启redis数据持久化, (可选)
appendonly yes

3.启动docker容器:(因为要使用自定义的配置文件,所以需要指定容器运行的命令为redis-server 容器内配置文件路径

docker run -d -p 6379:6379 --name redis --privileged=true \
           -v /app/redis/redis.conf:/etc/redis/redis.conf \
           -v /app/redis/data:/data \
           redis:6.0.8 \
           redis-server /etc/redis/redis.conf

niginx