Docker安装和使用

官方文档地址:https://docs.docker.com/

一、ContenOS系统上安装Docker

1.卸载旧版本

较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项

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

2.设置存储库

// 下载工具包
$ sudo yum install -y yum-utils

// 使用官方源地址(比较慢)
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
// 国内阿里云(推荐)
$ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// 清华大学源
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

3.启用夜间或测试存储库(非必须)

这些存储库包含在上面的文件中,但默认情况下会禁用。您可以在稳定存储库旁边启用它们。以下命令启用夜间存储库。docker.repo

$ sudo yum-config-manager --enable docker-ce-nightly

要启用测试通道,运行以下命令:

$ sudo yum-config-manager --enable docker-ce-test

您可以通过用标志运行命令来禁用夜间或测试存储库。要重新启用它,请使用标志。以下命令禁用夜间存储库。yum-config-manager--disable--enable

$ sudo yum-config-manager --disable docker-ce-nightly

4.安装 Docker Engine-Community

安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:

$ sudo yum install docker-ce docker-ce-cli containerd.io

要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:

  • 列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序
$ yum list docker-ce --showduplicates | sort -r

docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable
  • 通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

5.启动docker

$ sudo systemctl start docker

6.启动验证

通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community

$ sudo docker run hello-world

7.配置镜像加速器

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://5seuwveb.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

8.卸载 docker

// 删除安装包:
$ yum remove docker-ce

// 删除镜像、容器、配置文件等内容:
$ rm -rf /var/lib/docker

二、几种修改 Docker 镜像默认存储位置的方法

查看系统版本

$ cat /etc/redhat-release 

查看内核信息

$ uname -r

1.使用软链接

我们知道在操作系统当中,默认情况下 Docker 容器的存放位置在 /var/lib/docker 目录下面,可以通过下面命令查看具体位置

# 默认存放位置
$ sudo docker info | grep "Docker Root Dir"

解决默认存储容量不足的情况,最直接且最有效的方法就是挂载新的分区到该目录。但是在原有系统空间不变的情况下,所以采用软链接的方式,修改镜像和容器的存放路径达到同样的目的。

# 停掉Docker服务 $ systemctl restart docker  
# 停掉Docker服务 $ service docker stop ```

> 然后移动整个 /var/lib/docker 目录到空间不较大的目的路径。这

时候启动 Docker 时发现存储目录依旧是 /var/lib/docker 目录,但是实际上是存储在数据盘 /data/docker 上了。

# 移动原有的内容
$ mv /var/lib/docker /data/docker
 
# 进行链接
$ ln -sf /data/docker /var/lib/docker

2.指定容器启动参数

在配置文件中指定容器启动的参数 --graph=/var/lib/docker 来指定镜像和容器存放路径。Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致。在 Ubuntu 中的位置是 /etc/default/docker 文件,在 CentOS 中的位置是 /etc/sysconfig/docker 文件。

# CentOS6
OPTIONS=--graph="/data/docker" --selinux-enabled -H fd://
 
# CentOS7
# 修改docker.service文件,使用--graph参数指定存储位置
$ vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph=/data/docker

原配置保持不变,添加–graph=/data/docker,/data/docker是新的存储位置
以下两个文件均可修改docker配置:

/etc/systemd/system/multi-user.target.wants/docker.service
/usr/lib/systemd/system/docker.service
# Ubuntu
# 因为Ubuntu默认没开启selinux机制
OPTIONS=--graph="/data/docker" -H fd://

将原先目录下所有的文件和目录拷贝到新目录下

$ sudo cp -rf /var/lib/docker/* /data/docker

重新启动之后,Docker 的路径就改成 /data/docker 了。

# 重新reload配置文件
$ sudo systemctl daemon-reload
 
# 重启docker服务
$ sudo systemctl restart docker.service

如果没有生效,按如下操作

vim /etc/default/docker  
# 添加配置信息
DOCKER_OPTS="--graph=/home/docker"  
# 保存退出
service docker restart  
# 发现配置并没有生效
# 解决方案:
 mkdir -p /etc/systemd/system/docker.service.d  
 cat /etc/systemd/system/docker.service.d/Using_Environment_File.conf  
# 如果没有该文件则自行创建,添加以下内容
[Service]  
EnvironmentFile=-/etc/default/docker  
ExecStart=  
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS  
# 载入配置重启服务
systemctl daemon-reload  
service docker restart  
# 查看配置是否生效
docker info | grep 'Docker Root Dir'

如果 Docker 的版本是 1.12 或以上的,可以修改或新建 daemon.json 文件。修改后会立即生效,不需重启 Docker 服务。

# 修改配置文件
$ vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://5seuwveb.mirror.aliyuncs.com"],
  "graph": "/progam/docker"
}

3. System 下创建配置文件

在 /etc/systemd/system/docker.service.d 目录下创建一个 Drop-In 文件 docker.conf,默认 docker.service.d 文件夹不存在,必须先创建它。创建 Drop-In 文件的原因,是我们希望 Docker服务使用 docker.conf 文件中提到的特定参数,将默认服务所使用的位于 /lib/systemd/system/docker.service 文件中的参数进行覆盖。

# 定义新的存储位置
$ sudo vi /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=/usr/bin/dockerd --graph="/data/docker" --storage-driver=devicemapper

保存并退出 vim 编辑器 /data/docker 就是新的存储位置,而 devicemapper 是当前 Docker 所使用的存储驱动。如果你的存储驱动有所不同,请输入之前第一步查看并记下的值。现在,你可以重新加载服务守护程序,并启动 Docker 服务了,这将改变新的镜像和容器的存储位置。为了确认一切顺利,运行 docker info 命令检查 Docker 的根目录。

# 重新reload配置文件
$ sudo systemctl daemon-reload
 
# 重启docker服务
$ sudo systemctl start docker

三、Docker的常用命令

基本命令详细参考:https://www.docker.org.cn/dockerppt/106.html

Dokcer常用命令

1.帮助命令

// 显示docker的版本信息
$ docker version

// 显示docker的系统信息,包括镜像和容器的数量
$ docker info

// 帮助命令
$ docker [命令] --help

2.镜像命令

// 查看所有本地主机上的镜像
$ docker images

命令可选项

可选项含义
-a -all列出所有镜像
-q -quiet只显示镜像的id

名词性解释

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   4 months ago   13.3kB
名称解释
REPOSITORY镜像的仓库源
TAG镜像的标签
IMAGE ID镜像的id
CREATED镜像创建的时间
SIZE镜像的大小

docker search 搜索镜像

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11120     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4216      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   825                  [OK]
可选项含义
--filter=STARTS=3000搜索STARTS分数3000以上的

docker pull 下载镜像

// 下载mysql5.7版本的镜像
$ $ docker pull mysql:5.7

// 不指定版本默认latest
$ $ docker pull mysql
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b4d181a07f80: Pull complete 
a462b60610f5: Pull complete 
578fafb77ab8: Pull complete 
524046006037: Pull complete 
d0cbe54c8855: Pull complete 
aa18e05cc46d: Pull complete 
32ca814c833f: Pull complete 
52645b4af634: Pull complete 
bca6a5b14385: Pull complete 
309f36297c75: Pull complete 
7d75cacde0f8: Pull complete 
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 删除镜像

// 删除指定id的镜像
$ $ docker rmi -f [id] [id]

// 递归删除所有镜像
$ $ docker rmi -f $(docker images -aq)

3.容器命令

首先安装一个容器,来测试学习容器命令

// 下载centos容器
docker pull centos

新建容器并启动

$ docker run [可选参数] image

可选项说明

参数说明
--name=Name容器名字,tomcat01 tomcat02,用来区分容器
-d后台方式运行
-it使用交互方式运行,进入容器查看内容
-p指定容器的端口 -p 主机端口:容器端口
-P随机指定端口

启动并进入容器

$ docker run -it centos /bin/bash
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker run -it centos /bin/bash
[root@719b8a4bb125 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

从容器中退回主机

// 容器停止退出
$ exit

// 容器不停止退出
$ ctrl + p + q
[root@719b8a4bb125 /]# exit
exit
[root@iZuf60iq1x5h6s5apkzxd3Z /]# ls
bin   dev  home        lib    lost+found  mnt  patch  root  sbin  sys  usr  www
boot  etc  install.sh  lib64  media       opt  proc   run   srv   tmp  var

查看当前正在运行的容器

$ docker ps

可选项说明

参数说明
-a列出当前正在运行的容器+带出历史运行过得容器
-n=?显示最近创建的容器(n:表示数量)
-q只显示容器的编号

删除容器

// 删除指定容器
$ docker rm [容器id]

// 递归删除所有容器
$ docker rm -f $(docker ps -aq)

// 删除所有容器
docker ps -a -q | xargs docker rm

启动和停止容器

// 启动容器
$ docker start [容器id]

// 重启容器
$ docker restart [容器id]

// 停止当前正在运行的容器
$ docker stop [容器id]

// 强制停止当前的容器
$ docker kill [容器id]

4.日志、元数据、进程的查看

查看容器日志

$ docker logs [可选参数] [容器id]
可选项说明
-t打印时间格式
-f保留打印窗口,持续打印
-n | --tail显示最后n行

查看容器中进程信息

$ docker top [容器id]

查看容器的元数据

$ docker inspect [容器id]

5.进入容器的命令和拷贝的命令

进入容器的命令

// 方式1:进入容器后开启一个新的终端,可以在里面操作(常用)
$ docker exec -it [容器id] /bin/bash|/bin/sh

// 方式2:进入容器正常执行的终端,不会启动新的进程
$ docker attach [容器id]

从容器内拷贝文件到主机上

$ docker cp 容器id:容器内路径 主机上路径

四、Docker部署教程

1.Docker内部署Nginx

搜索Nginx容器镜像

$ sudo docker search nginx

下载Nginx镜像

$ sudo docker pull nginx

启动容器

$ sudo docker run -d --name nginx01 -p 3344:80 nginx

查看容器启动情况

$ sudo docker exec -it nginx01

2.Docker内部署Tomcat

下载Tomcat镜像

$ sudo docker pull tomcat:8.5

启动容器

$ sudo docker run -d --name tomcat01 -p 3355:8080 tomcat:8.5

查看容器启动情况

// 查看内容和CPU情况
$ sudo docker stats

// 进入容器内查看
$ sudo docker exec -it tomcat01

3.Docker内部署Elasticsearch

下载Elasticsearch镜像

$ sudo docker pull elasticsearch:7.6.2

启动容器

$ sudo docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=singl-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

查看容器启动情况

$ sudo docker exec -it tomcat01

五、Docker可视化界面管理

Portainer 图形化界面

$ sudo docker run -d -p:8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

六、Docker镜像

什么是镜像?

镜像加载原理

分层思想

容器快照镜像 docker commit

$ sudo docker commit -a="作者信息" -m="提交信息描述" 容器id 新镜像名称:[TAG]

六、容器数据卷

1.什么是容器数据卷

容器数据卷:宿主机器中可以在容器之间进行共享和重用的一系列文件和文件夹。

2.数据卷的作用(为什么要使用)

1.容器的持久化
2.容器间继承、共享数据
3.容器与宿主机之间的数据共享

3.数据卷添加的两种方式

1.命令方式(可以带权限)

$ sudo docker run -it 宿主机目录路径:容器目录路径[:权限] 容器id

2.DockerFile方式

# 1.新建Dockerfile文件,名称任意推荐dockerfile作为前缀
$ sudo vim dockerfile01

# 2.编辑dockerfile01文件,并编写下面命令
FROM 目标镜像 // 设置基础镜像
VOLUME["宿主机上的卷目录路径1", "宿主机上的卷目录路径1" ...] // 设置数据卷挂载路径

CMD echo "--- END ---" // 命令行
CMD /bin/bash // 命令行

# 3.使用docker build命令创建镜像(注:结尾有个`.`)
$ sudo docker build -f dockerfile文件路径 -t 镜像目标路径:[TAG] .

3.具名和匿名挂载

如何确定是匿名挂载还是具名挂载,还是指定路径挂载

$ -v 容器内路径                 #匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径
$ -v 卷名:容器内路径            #具名挂载
$ -v 宿主内路径:容器内路径       #指定路径挂载

1.匿名挂载:这里以Nginx为例:

$ sudo docker run -d -P --name nginx01 -v /etc/nginx nginx
 
//端口映射-p(小写)-P(大写)区别
-p指定要映射的端口,一个指定端口上只可以绑定一个容器
-P将容器内部开放的网络端口随机映射到宿主机的一个端口上

查看所有volume情况

$ sudo docker volume ls
DRIVER              VOLUME NAME
local               4a3daf61b2e4f14edd92eaf84515b82ac863ca945497b5a71642506b88cfea49
local               78a889203c9cd658a64b6bf25870bea2a25a11e127aa48b027d0750f44a7cc78
local               2985c543eadf37ced04f451c8bd056df2032518eab3dc1e00c24766ac2aaf8b5
local               c0cf9727552b0df0ebd88919cab016730450a3a1a31f48905c7b88cf2152dd36
local               c00400d2fea2d074078b8f20d03c111df306beb6385aeed2d86a101e3b3bfe72
local               ce7cc5dac50c58ff44a5f13f84d00e2100fadbcf1fea2788b334854f2e4c1080
local               ffe9eafba04a7e2ae4d7e12f1049c47f041a3d6b0eb6bcfa4734f08184cfb460

这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器的路径!

2.具名挂载:就是挂载的卷定义一个自己的名字,可以方便的查找

$ sudo docker run -d -P --name nginx02 -v Bertram:/etc/nginx nginx
$ sudo docker volume ls
DRIVER              VOLUME NAME
.....
local               Bertram

查看卷所对应的路径

$ sudo docker volume inspect Bertram
[
    {
        "CreatedAt": "2020-10-19T15:24:58+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/data/docker/volumes/Bertram/_data",
        "Name": "Bertram",
        "Options": null,
        "Scope": "local"
    }
]

docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes目录下
我们通过具名挂载可以方便的找到我们的一个卷,大多数使用的都是具名挂载。

3.扩展

# 通过 -v 容器内路径,ro rw改变读写权限
ro readonly  #只读
rw readwrite #可读可写
 
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v Bertram:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v Bertram:/etc/nginx:rw nginx
# 只要看到ro就说明这个路径只能通过宿主机来操作,容器内无法操作。

4.数据卷容器

如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

# 1.新建容器nginx01并挂载数据卷Bertram
$ sudo docker run -d -P --name nginx01 -v Bertram:/etc/nginx:ro nginx

# 2.新建容器nginx02并挂载数据卷容器nginx01
$ sudo docker run -d -P --name nginx02 --volumes-from nginx01 nginx

注:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

# 1.删除容器nginx01,nginx02依然可以共享Bertram数据卷
# 2.新建容器nginx03并挂载数据卷容器nginx02
$ sudo docker run -d -P --name nginx03 --volumes-from nginx02 nginx
# 3.删除容器nginx02,这时nginx03可以访问Bertram数据卷
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值