「Docker 学习系列」之 Docker 安装及入门「内容有点多-建议收藏」

189 阅读6分钟

🙏废话不多说系列,直接开整🙏

美女2.png


一、Docker 安装教程(菜鸟教程)

(1)Windows 安装 docker

① Windows安装Docker ;

② 配置好镜像加速 ;

Windows 10
对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,
打开配置窗口后左侧导航菜单选择 Daemon。
在 Registrymirrors 一栏中填写加速器地址 https://registry.docker-cn.com ,
之后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。

image.png

(2)Linux 安装 docker

  1. Ubuntu 安装 Docker:www.runoob.com/docker/ubun…
  2. CentOS 安装 Docker:www.runoob.com/docker/cent…
  3. Windows 安装 Docker:www.runoob.com/docker/wind…

🐓 下面以 Ubuntu 安装 Docker 示例:

① 检查 Ubuntu 是否已存在 Docker
drew@ubuntu:~$ docker
Command 'docker' not found, but can be installed with:

sudo snap install docker     # version 19.03.13, or
sudo apt  install docker.io

See 'snap info docker' for additional versions.

如果出现上述问题,则证明未安装 docker 。

② 安装 Docker
# 第一种方式:(文件安装在 /etc/docker  /usr/bin/docker 等目录下)
sudo apt install docker.io

# 第二种方式:使用此方式,后期在挂载数据时需要挂载 /home 目录下,不能直接挂载 /data 目录下
$ sudo snap install docker

image.png

安装成功结果如下:
drew@ubuntu:~$ sudo snap install docker
[sudo] password for drew:
docker 19.03.13 from Canonical✓ installed
③ 检查 docker 的版本
drew@ubuntu:~$ docker -v
Docker version 19.03.13, build cd8016b6bc
④ 检查 docker 运行状态
drew@ubuntu:~$ docker
⑤ 卸载 docker 和 相关内容

不同的docker 安装方式,安装的目录也不同,所以卸载时需要删除的文件夹也不同。

第一种:sudo apt install docker.io 方式安装的。

# 删除安装包
sudo apt-get --purge docker-ce

# 删除镜像,容器,配置文件等内容(注意最好检查下指定目录中是否存在相关docker内容)
sudo rm -rf /var/lib/docker

# 检查docker安装的位置
drew@ubuntu:~$ whereis docker
docker: /snap/bin/docker.compose /snap/bin/docker /snap/bin/docker.machine /snap/bin/docker.help

第二种:sudo snap install docker 方式安装的。

安装的位置为:

minio1@ubuntu:~$ whereis docker
docker: /usr/bin/docker /etc/docker /usr/share/docker.io /usr/share/man/man1/docker.1.gz

卸载需注意:

# 删除安装的docker镜像
sudo apt-get --purge docker-ce
# 删除docker相关的内容
sudo rm -rf /usr/bin/docker /etc/docker /usr/share/docker.io /usr/share/man/man1/docker.1.gz
# 删除完毕 OVER!
⑥ docker 的帮助指令
$ docker --help

结果如下:

drew@ubuntu:/snap/bin$ docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default
                           "/home/drew/snap/docker/796/.docker")
  -c, --context string     Name of the context to use to connect to the
                           daemon (overrides DOCKER_HOST env var and
                           default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level
                           ("debug"|"info"|"warn"|"error"|"fatal")
                           (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default
                           "/home/drew/snap/docker/796/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default
                           "/home/drew/snap/docker/796/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default
                           "/home/drew/snap/docker/796/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  deploy      Deploy a new stack or update an existing stack
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.
⑦ 显示docker 服务端和客户端的版本
# 查看docker的客户端 和 服务端的版本信息。
drew@ubuntu:/snap/bin$ sudo docker version
# 客户端版本信息
Client:
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        cd8016b6bc
 Built:             Fri Feb  5 15:56:39 2021
 OS/Arch:           linux/amd64
 Experimental:      false

# 服务端版本信息
Server:
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       bd33bbf
  Built:            Fri Feb  5 15:58:24 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
⑧ docker 查询 ♥
# docker 查询可安装的 redis 版本
drew@ubuntu:/snap/bin$ sudo docker search redis
NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis                            Redis is an open source key-value store that…   9339                [OK]
bitnami/redis                    Bitnami Redis Docker Image                      178                                     [OK]
sameersbn/redis                                                                  82                                      [OK]
grokzen/redis-cluster            Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2      77
rediscommander/redis-commander   Alpine image for redis-commander - Redis man…   57                                      [OK]
redislabs/redisearch             Redis With the RedisSearch module pre-loaded…   33
redislabs/redis                  Clustered in-memory database engine compatib…   29
redislabs/redisinsight           RedisInsight - The GUI for Redis                29
oliver006/redis_exporter          Prometheus Exporter for Redis Metrics. Supp…   25
redislabs/rejson                 RedisJSON - Enhanced JSON data type processi…   23
arm32v7/redis                    Redis is an open source key-value store that…   22
bitnami/redis-sentinel           Bitnami Docker Image for Redis Sentinel         21                                      [OK]
redislabs/redisgraph             A graph database module for Redis               15                                      [OK]
arm64v8/redis                    Redis is an open source key-value store that…   12
webhippie/redis                  Docker images for Redis                         11                                      [OK]
redislabs/redismod               An automated build of redismod - latest Redi…   10                                      [OK]
s7anley/redis-sentinel-docker    Redis Sentinel                                  10                                      [OK]
insready/redis-stat              Docker image for the real-time Redis monitor…   10                                      [OK]
goodsmileduck/redis-cli          redis-cli on alpine                             9                                       [OK]
circleci/redis                   CircleCI images for Redis                       5                                       [OK]
centos/redis-32-centos7          Redis in-memory data structure store, used a…   5
clearlinux/redis                 Redis key-value data structure server with t…   3
wodby/redis                      Redis container image with orchestration        1                                       [OK]
tiredofit/redis                  Redis Server w/ Zabbix monitoring and S6 Ove…   1                                       [OK]
xetamus/redis-resource           forked redis-resource                           0                                       [OK]
⑨ Docker 容器查询
sudo docker ps  # 查看正在运行的服务
sudo docker container ls  # 所有的容器

image.png

二、Windows Docker 界面

Windows 控制界面-初步使用 Docker命令:

image.png

三、Docker 基础知识

① 官方网址:docs.docker.com/get-docker/

② 菜鸟学习教程:www.runoob.com/docker/dock…

(1)容器的相关基本命令使用演示

# 获取镜像(例如,获取redis的最新可用的镜像)
docker pull redis:latest

# 启动容器(例如启动redis容器,并提供可交互式终端的操作)
docker run -it redis /bin/bash
# 启动已停止运行的容器(注意:此处 docker start 容器ID)
docker start b750bbbcfd88 # 或 docker start [容器名]
# 启动并后台运行( -d 指定容器的运行模式,表示不会进入容器,想要进入容器内部使用指令 docker exec
docker start -itd --name redis-test redis /bin/bash

# 停止一个容器
docker stop [容器ID]

# 重启一个容器
docker restart [容器ID]

# 查看所有的容器(包括正在运行、已终止的容器)
docker ps -a
# 查看正在运行的容器
docker ps

# 进入容器
#	在使用 -d 参数,容器启动后会进入后台。此时想要进入容器,可以通过一下指令进入:
docker attach
docker exec  # 推荐大家使用 docker exec 命令,因此此退出容器终端,不会导致容器的停止。
# 1. attach 命令
docker attach [容器ID]  # 如果从这个容器退出,会导致容器的停止。
# docker exec --help # 可以查看容器的exec命令相关文档手册

# 导出和导入容器
## 1.导出容器(如果要导出本地某个容器,可以使用 docker export 命令)
## docker export [容器ID] > [自定义导出后的容器名.tar]   # 这样的话导出的容器快找到本地文件。
docker export 1e560fca3906 > redis-test.tar
## 2.导入容器快照(有两种方式)
## 方式一:从容器快照文件中在导入为镜像,例如:
cat docker/redis-test.tar | docker import - test/redis-test:v1
## 方式二:从指定的URL 或者 某个目录来导入,例如:
docker import  http://example.com/exampleimage.tgz example/imagerepo


# 删除容器(语法: docker rm -f [容器ID])
docker rm -f 1e560fca3906

# 清楚已终止的容器
docker container prune

导入镜像(方式一:本地容器 快照版本的镜像导入)

image.png

(2)网络端口的快捷方式

# 方式一:
docker ps  # 显示所有正在运行的容器时,将正在运行的容器的端口映射也显示出来了。
# 方式二:
## 语法:docker port [容器ID / 容器名]
docker port bf08b7f2cd89 # 或者
docker port redis-test2

(3)查看 web 应用程序日志

docker logs [容器ID / 容器名],可以查看容器内部的标准输出。

docker logs -f bf08b7f2cd89 # 进入容器内部,并查看相关日志 -f :类似使用 tail -f 一样来输出容器内部的标准输出

docker logs bf08b7f2cd89 # 或者
docker container logs bf08b7f2cd89 # 或者
docker container logs redis-node2

(4)查看 web 应用容器的进程

# 查看容器内部运行的进程,语法 docker top [容器ID/容器名]
docker top redis-node1

# 示例
$ sudo docker top redis-node1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
999                 6289                6272                0                   Apr24               ?                   00:01:12  

查看容器redis-node1进程情况

image.png

(5)检查 web 应用程序

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

docker inspect redis-node3

返回一大串 JSON ,记录着 此Docker 容器(即 redis-node3)的配置和状态信息 (查看容器 redis-node3 的配置信息和状态)

image.png

(6)查看最后一次创建的容器

# 查看所有容器中的最近创建的一个容器
docker ps -l

image.png

(7)查看 docker 目前存在的所有容器

# 查看所有的容器
docker ps -a

image.png

(8)修改docker指定容器的配置文件

一般 docker 中没有 vi 或 vim 等其他相应的文本编辑器,为了写个东西安装个vim就可以解决问题,除此之外我们可以:

① 登录docker中,找到需要编辑的文件位置;

sudo docker ps -a # 显示所有docker中的容器
sudo docker exec -it xxx  /bin/bash

② 通过 docker cp 把这个文件拷贝出来;

# # 注意:xxxx是 docker ps -a 获取的 container_id (可以试试container_name)
sudo docker cp xxxx:/etc/mysql/my.cnf  /home/drew/

③ 再拷贝回去;

# 注意:xxxx是 docker ps -a 获取的 container_id (可以试试container_name)
sudo docker cp /home/drew/my.cnf  xxxx:/etc/mysql/

四、Docker 镜像

主要内容:① 管理和使用本地Docker 主机镜像;② 创建镜像;

(1)镜像列表信息详解

$ docker images

minio1@ubuntu:/home/redis-data/node2$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        latest    739b59b96069   4 days ago      105MB
redis        5.0.5     63130206b0fa   19 months ago   98.2MB
redis        4.0.9     bfcb1f6df2db   2 years ago     107MB

参数说明:

参数说明
REPOSITORY表示镜像的仓库源头
TAG镜像的标签(一般指版本号)
IMAGE ID镜像ID
CREATED镜像创建时间
SIZE镜像大小

注意:同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本。

# 1.运行镜像,不需要交互式shell
docker run -i -t ubuntu:21.02
# 2.运行镜像,需要交互式shell
docker run -i -t ubuntu:21.02 /bin/bash

(2)查找镜像

两种方式:① 使用 docker 命令的方式;② 浏览器进入 docker 官网查找;

# 方式一:(推荐)
docker search tomcat

# 方式二:
# 从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

image.png

(3)拉取 、删除镜像

# 拉取最新的tomcat镜像
docker pull tomcat:latest

# 删除镜像
docker rm redis-node1

(4)创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像;
  2. 使用 Dockerfile 指令来创建一个新的镜像。
方式一:更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

runoob@runoob: docker run -t -i ubuntu:15:10 /bin/bash
root@e218edb10161:/#

在运行的容器内使用 apt-get update 命令来更新。

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

参数说明

参数说明
-m提交的描述信息
-a指定镜像作者
e218edb10161容器ID
runoob/ubuntu:v2指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像  runoob/ubuntu:v2;

# 查看新镜像是否存在
runoob@runoob:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
runoob/ubuntu       v2                  70bf1840fd7c        15 seconds ago      158.5 MB

# 运行新镜像,看是否有问题
runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash                            
root@1a9fbdeb5da3:/#
方式二:Dockerfile 构建镜像 ♥
① 创建一个Dockerfile

其中包含一些指令,来告诉Docker 如果构建我们的镜像:如下

$ touch Dockerfile
$ vim Dockerfile
# 填入下面内容 == start
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
# == end

说明:

  1. 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的;
  2. FROM:指定使用那个镜像源;
  3. RUN:告诉 docker 在镜像内执行的命令,安装了什么……;
② 通过 docker build 构建镜像
runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
 ---> Using cache
 ---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Using cache
 ---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

参数说明:

参数说明
-t指定要创建的目标镜像名
.Dockerfile 文件所在的目录,可以指定 Dockerfile 的绝对路径。
# 查看 docker 目前的所有镜像
runoob@runoob:~$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
runoob/centos       6.7                 860c279d2fec        About a minute ago   190.6 MB
runoob/ubuntu       v2                  70bf1840fd7c        17 hours ago         158.5 MB

# 使用新的镜像来创建容器(在镜像内已经创建了用户 runoob 在centos:6.7容器Linux服务中)
runoob@runoob:~$ docker run -t -i runoob/centos:6.7  /bin/bash
[root@41c28d18b5fb /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)

(5)设置镜像标签

# 语法格式:docker tag [镜像ID]
# 下面内容依次对应:镜像ID - 用户名称 - 镜像源名 - 新标签名
docker tag 860c279d2fec runboob/centos:dev

# 查看添加标签之后的所有镜像
runoob@runoob:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
runoob/centos       6.7                 860c279d2fec        5 hours ago         190.6 MB
runoob/centos       dev                 860c279d2fec        5 hours ago         190.6 MB
runoob/ubuntu       v2                  70bf1840fd7c        22 hours ago        158.5 MB

附录

(1)问题1:docker 命令权限不够,docker 命令被禁止执行。

① 问题详情:

minio1@ubuntu:/home/redis-data/node2$ docker ps -l
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.24/containers/json?limit=1: dial unix /var/run/docker.sock: connect: permission denied

② 解决方案:

方法一:使用 sudo 获取管理员权限,运行 docker 命令

# 获取管理员权限之后,再运行 docker 命令
$ sudo docker ps -l

方法二:docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令。

sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
newgrp docker     #更新用户组
docker ps    #测试docker命令是否可以使用sudo正常使用

🙏至此,非常感谢阅读🙏

美女2.png