Docker 操作

docker的安装

Docker 需要两个重要的安装要求:

  • 它仅适用于 64 位 Linux 安装
  • 它需要 Linux 内核版本 3.10 或更高版本。

要查看当前的内核版本,请打开终端并键入uname -r命令以查看内核版本:

[root@localhost local]# uname -r
3.10.0-1062.4.3.el7.x86_64

查看操作系统是32位还是64位:

[root@localhost local]# uname --m
x86_64
CentOS安装Docker

更新yum到最新

sudo yum update

安装需要的软件包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源为阿里云

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker(-ce和-ee两个版本,-ee是要收费的…)

sudo yum install docker-ce

查看版本

docker-v

Ubuntu安装Docker

安装 Ubuntu 的时候使用的是用户登录,现在切换到超级管理员,如果是在普通用户登录,操作 etc 下的配置文件必须使用 sudo 提权,麻烦…

#设置 root 密码
hok@ubuntu:~$ sudo passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
# 切换到 管理员(root)
hok@ubuntu:~$ su
Password: 
# 切换到 hok 用户
root@ubuntu:/home/hok# su hok
# 切换到 root...
hok@ubuntu:~$ su
Password: 
root@ubuntu:/home/hok# 

设置允许远程登录 root

root@ubuntu:~# vim /etc/ssh/sshd_config
#改为 yes
#PermitRootLogin prohibit-password
PermitRootLogin yes
#重启 ssh 服务
root@ubuntu:~# service ssh restart

安装必要的一些系统工具

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

安装 GPG 证书

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

写入软件源信息

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新并安装 Docker CE

sudo apt-get -y update && sudo apt-get -y install docker-ce

如果是 root 登录, sudo 可以去掉, 对于 xshell,粘贴的快捷键是 shift+insert

配置镜像加速器

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件 /etc/docker/daemon.json (没有?先进入/etc/docker 目录,用如下命令)来使用加速器

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3khfsg0t.mirror.aliyuncs.com"]
}
EOF
centos8 安装 docker 报错问题

https://blog.csdn.net/ywyngq/article/details/118158608

docker 常用命令

docker镜像是唯一的,但是基于镜像创建的容器名字可以有很多,比如tomcat、mysql…利用这些镜像可以创建好多实例(类似于类于对象)

查看 docker 磁盘使用情况

docker system df

重启

systemctl restart docker

查看 docker 信息

docker info

拉取镜像,网址

docker pull tomcat/mysql/nginx

查看所有镜像

docker images

删除某一镜像

docker rmi nginx

启动/停止docker服务

systemctl start/stop docker 

redis 启动

docker run -p 6379:6379 --name redis -d redis:latest

查看容器(正在运行的容器)

docker ps

查看容器(正在运行的和没运行的)

docker ps -a

查询最后一次创建的容器

docker ps -l

停止/启动容器

docker stop/start 容器ID

删除容器

docker rm 容器ID

删除容器时,容器必须是停止状态,否则会报错

强制删除容器

docker rm -f 容器I

强制删除所有的停止的容器

docker rm -f ${docker ps -qa}

清理所有处于终止状态的容器

docker container ls -a 命令可以查看所有已经创建的包括终止状态的容器

停止

docker container stop 容器ID

查看容器启动日志

docker logs -f 容器ID

重启

docker container restart 容器ID

如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。

docker container prune

查看 docker 网桥配置

[root@localhost etc]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f76e9dbe1b35   bridge    bridge    local
8c700a8edf7e   host      host      local
0d276c1401cb   none      null      local

删除虚玄镜像

[root@localhost mytomcat]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat            latest              526d8e59aecf        7 minutes ago       507MB
<none>              <none>              31aadb129895        About an hour ago   507MB
tomcat              latest              6fa48e047721        2 weeks ago         507MB
[root@localhost mytomcat]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:31aadb129895bbab6d8c59e1a7d54d4bc579d9eee39e00dd0b54e82843916514
deleted: sha256:39644b3b75b0f9d5e944a62938c0d8cbdf564477f0260e94e811ee748cd5cd4f
Total reclaimed space: 27B
[root@localhost mytomcat]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat            latest              526d8e59aecf        7 minutes ago       507MB
tomcat              latest              6fa48e047721        2 weeks ago         507MB

启动容器后,查看容器细节

docker inspect 容器ID

docker 网络配置
在这里插入图片描述
删除 docker 网络

docker network rm 网络ID

查看 docker 网桥细节

docker inspect 网络ID

查看所有数据卷

[root@localhost /]# docker volume ls
DRIVER    VOLUME NAME
local     1dc3e81c9af036b8da7328ae921af8e2a202fa23aed5363e817a4a61ab2d56b5
local     b3cf1a5f13090fd2c407f025facc2df3ce89cb152b0a51a0ddf6c0d28491202c
local     mysqldata

查看某一数据卷细节

[root@localhost /]# docker volume inspect mysqldata
[
    {
        "CreatedAt": "2021-08-15T14:01:43+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysqldata/_data",
        "Name": "mysqldata",
        "Options": null,
        "Scope": "local"
    }
]

从上面结果可以看到 Mountpoint 挂载的主机位置,可以 cd /var/lib/docker/volumes/mysqldata/_data 查看相关配置,并且可以编辑

docker 安装 rabbitmq

下载镜像,带有management页面的

docker pull rabbitmq:3.8.2-management

启动(亲测可行)

root@deployment:/# docker run -d --hostname rabbitmq:3.8.3-management --name rabbitmq -p 15672:15672 rabbitmq:3.8.3-management

或者

docker run -d --name rabbitmq-3.8.3-management -p 5672:5672 -p 15672:15672 -v /opt/rabbitmq/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 479479d8e188[镜像Id]

说明:
-d 后台运行容器;
–name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;
RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
RABBITMQ_DEFAULT_USER:默认的用户名;
RABBITMQ_DEFAULT_PASS:默认用户名的密码

docker 安装 rabbitmq 延时消息插件

首先去 github 上把插件下载下来

然后把插件上传到 linux ,看接下来步骤:

docker ps 看看rabbitmq 是否启动

如果启动了则docker exec -it rabbitmq-3.8.3-management /bin/bash 进入安装目录

root@deployment:~# docker exec -it rabbitmq-3.8.3-management /bin/bash
# 可以看到有 plugins 目录
root@myRabbit:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	plugins  proc  root  run  sbin	srv  sys  tmp  usr  var

可以看到有 plugins 目录,接下来 ctrl+d 退出,把插件拷贝到 rabbitmq 安装目录的plugins 目录下

root@deployment:~# docker cp /usr/local/tmp/rabbitmq_delayed_message_exchange-3.8.0.ez rabbitmq-3.8.3-management:/plugins

为了保险你可以进入 plugins 目录看是否拷贝成功

root@deployment:~# docker exec -it rabbitmq-3.8.3-management /bin/bash
root@myRabbit:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	plugins  proc  root  run  sbin	srv  sys  tmp  usr  var
root@myRabbit:/# cd plugins
# 有在呢
root@myRabbit:/plugins# ls -l|grep delay
-rw-r--r-- 1 root     root       43377 Mar 27 08:07 rabbitmq_delayed_message_exchange-3.8.0.ez

接下来,启用插件,并重启 rabbitmq

root@myRabbit:/plugins# rabbitmq-plugins enable rabbitmq_delayed_message_exchange
Enabling plugins on node rabbit@myRabbit:
rabbitmq_delayed_message_exchange
The following plugins have been configured:
  rabbitmq_delayed_message_exchange
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@myRabbit...
The following plugins have been enabled:
  rabbitmq_delayed_message_exchange

started 1 plugins.
root@deployment:~# docker restart rabbitmq-3.8.3-management

最后你可以打开 rabbitmq管理页面,在Exchanges选项卡下,点击Add a new exchange,在Type里面看是否出现了x-delayed-message选项

docker 安装 tomcat

#下载镜像
docker pull tomcat
#启动
docker run -p 8080:8080 --name tomcat -d tomcat
# 参数说明:
-d:让容器在后台运行
-P:将容器内部使用的网络端口映射到我们使用的主机上

docker-hub 下载的 tomcat 部署好后,客户端浏览器你发现访问不了,这是正常的,因为 ROOT 和 webapps 那些目录都没有了…

docker 安装 mysql

首先下载镜像,默认下载 latest

docker pull mysql

启动 mysql,MYSQL_ROOT_PASSWORD表示给根用户(root)设置密码

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

启动完用客户端连接,发现报 2058

root@d2e9d46df524:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,plugin,authentication_string from mysql.user;

使用数据卷持久化 mysql 配置文件和 存储数据

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 -v mysqldata:/var/lib/mysql -v mysqlconf:/etc/mysql mysql:5.7.32

下面这个是安装 mysql 8 以上版本
在这里插入图片描述

这样哪怕把容器删除了,持久化到 linux 机器的数据和配置依然存在,下次重新实例化容器的时候重新指定即可,数据和配置都还在

mysql8 配置表名大小写不敏感问题

交互的方式启动容器

docker run -it [镜像名] /bin/bash 

交互完了就删除

docker run -it --rm tomcat /bin/bash

交互的方式进入容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力

docker exec -it 容器ID /bin/bash
[root@localhost /]# docker exec -it 204b0f04f689 /bin/bash
root@204b0f04f689:/usr/local/tomcat# pwd
/usr/local/tomcat

参数解释:

  • -t:在新容器内指定一个伪终端或终端
  • -i:允许你对容器内的标准输入进行交互

此时我们已进入一个204b0f04f689 系统的容器,在容器中运行命令 cat /proc/versionls 分别查看当前系统的版本信息和当前目录下的文件列表

root@204b0f04f689:/usr/local/tomcat# cat /proc/version
Linux version 3.10.0-1062.4.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Wed Nov 13 23:58:53 UTC 2019
root@204b0f04f689:/usr/local/tomcat# ls
BUILDING.txt	 LICENSE  README.md	 RUNNING.txt  conf     lib   native-jni-lib  webapps
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin	      include  logs  temp	     work

退出容器:

  • 运行 exit
  • 使用 CTRL + D

查看 web 应用日志

[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
204b0f04f689        tomcat              "catalina.sh run"        20 minutes ago      Up 17 minutes       0.0.0.0:8080->8080/tcp              tomcat
2523581ab95a        mysql:5.7           "docker-entrypoint.s…"   5 days ago          Up 5 days           0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@localhost /]# docker logs -f 204b0f04f689/tomcat

参数说明:

  • -f:让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出

查看 WEB 应用容器的进程

[root@localhost /]# docker top mysql
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             2282                2266                0                   Dec25               ?                   00:04:21            mysqld

检查 WEB 应用程序

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

[root@localhost /]# docker inspect mysql

docker 镜像管理

镜像列表

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

可以使用 docker images 来列出本地主机上的镜像:

[root@localhost /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              6fa48e047721        2 weeks ago         507MB
mysql               5.7                 1e4405fe1ea9        5 weeks ago         437MB

参数说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果不指定一个镜像的版本标签,例如你只使用 tomcat,docker 将默认使用 tomcat:latest 镜像。

获取镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。下面获取 tomcat时指定了 TAG

[root@localhost /]# docker pull tomcat:jdk8
jdk8: Pulling from library/tomcat
146bd6a88618: Pull complete 
9935d0c62ace: Pull complete 
db0efb86e806: Pull complete 
e705a4c4fd31: Pull complete 
3d3bf7f7e874: Pull complete 
49371c5b9ff6: Pull complete 
e7873a7ca0fd: Pull complete 
925a95344b57: Pull complete 
9114285af3b8: Pull complete 
82ad83395ce2: Pull complete 
Digest: sha256:afa5c0b06a8625c7f70a4ba9e242bdc52fd3c98d424438319c81ae882a946d11
Status: Downloaded newer image for tomcat:jdk8
docker.io/library/tomcat:jdk8
[root@localhost /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              jdk8                94e31e5297d1        47 hours ago        507MB
tomcat              latest              6fa48e047721        2 weeks ago         507MB
mysql               5.7                 1e4405fe1ea9        5 weeks ago         437MB
查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

[root@localhost /]# docker search nginx
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                             Official build of Nginx.                        12403               [OK]                
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   1708                                    [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   749                                     [OK]
linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   84                                      
bitnami/nginx                     Bitnami nginx Docker Image                      74                                      [OK]
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   60                                      [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co…   35                                      [OK]
.......

说明:

  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否docker官方发布
创建镜像

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

  • 从已经创建的容器中更新镜像,并且提交这个镜像
  • 使用 Dockerfile 指令来创建一个新的镜像
更新镜像

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

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
01bc1dd29828        tomcat              "/bin/bash"              4 minutes ago       Up 4 minutes        8080/tcp                            wizardly_ishizaka
204b0f04f689        tomcat              "catalina.sh run"        46 minutes ago      Up 43 minutes       0.0.0.0:8080->8080/tcp              tomcat
2523581ab95a        mysql:5.7           "docker-entrypoint.s…"   5 days ago          Up 5 days           0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@localhost ~]# docker exec -it 01bc1dd29828 /bin/bash
root@01bc1dd29828:/usr/local/tomcat# apt-get update
Ign:1 http://deb.debian.org/debian stretch InRelease
Hit:2 http://security.debian.org/debian-security stretch/updates InRelease
Hit:3 http://deb.debian.org/debian stretch-updates InRelease
Hit:4 http://deb.debian.org/debian stretch Release 
Reading package lists... Done                      

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

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

[root@localhost ~]# docker commit -m="has update" -a="hogen" 01bc1dd29828 hogen/tomcat:v2
sha256:2586747a18c26756ff9b0e6e20cdffb154cb3d841c34fd5bb8133c06e2070771

参数说明:

  • -m:提交的描述信息
  • -a:指定镜像作者
  • 01bc1dd29828:容器ID
  • hogen/tomcat:v2:指定要创建的目标镜像名,TAG名

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

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hogen/tomcat        v2                  2586747a18c2        8 seconds ago       523MB
tomcat              jdk8                94e31e5297d1        2 days ago          507MB
tomcat              latest              6fa48e047721        2 weeks ago         507MB

使用我们的新镜像 hogen/tomcat 来启动一个容器:

[root@localhost ~]# docker run -it hogen/tomcat:v2 /bin/bash
root@0904f7582b5e:/usr/local/tomcat# 

docker run -it [镜像名] /bin/bash: 启动容器的时候立即进入交互

Dockerfile

在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。

一次构建到处运行:通俗的讲就是把我们的应用程序以及需要的一些操作打包成镜像,这时候就能做到一次构建到处运行,而 Dockerfile 就是用来干这个事儿的

docker 客户端启动了两个窗口,其中一个启动了容器

[root@localhost ~]# docker run -p 8080:8080 tomcat
31-Dec-2019 10:28:22.424 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.50
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Dec 7 2019 19:19:46 UTC
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.50.0
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-1062.4.3.el7.x86_64
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-8/jre
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_232-b09
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
31-Dec-2019 10:28:22.426 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
.....

在另一个窗口查看:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
d17e030abc9a        tomcat              "catalina.sh run"        2 minutes ago       Up 2 minutes        0.0.0.0:8080->8080/tcp              charming_chatterjee

接着以交互的方式进入容器:

[root@localhost ~]# docker exec -it d17e030abc9a bash
root@d17e030abc9a:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  include  lib	logs  native-jni-lib  temp  webapps  work
root@d17e030abc9a:/usr/local/tomcat# cd webapps/ROOT/
root@d17e030abc9a:/usr/local/tomcat/webapps/ROOT# ls -al
total 184
drwxr-xr-x. 3 root root  4096 Dec 13 23:52 .
drwxr-xr-x. 7 root root    81 Dec  7 19:21 ..
-rw-r--r--. 1 root root  7136 Dec  7 19:23 RELEASE-NOTES.txt
drwxr-xr-x. 2 root root    21 Dec 13 23:52 WEB-INF
-rw-r--r--. 1 root root 27235 Dec  7 19:23 asf-logo-wide.svg
-rw-r--r--. 1 root root   713 Dec  7 19:21 bg-button.png
-rw-r--r--. 1 root root  1918 Dec  7 19:21 bg-middle.png
-rw-r--r--. 1 root root  1401 Dec  7 19:21 bg-nav.png
-rw-r--r--. 1 root root  3103 Dec  7 19:21 bg-upper.png
-rw-r--r--. 1 root root 21630 Dec  7 19:21 favicon.ico
-rw-r--r--. 1 root root 12219 Dec  7 19:23 index.jsp
-rw-r--r--. 1 root root  2376 Dec  7 19:21 tomcat-power.gif
-rw-r--r--. 1 root root  5581 Dec  7 19:23 tomcat.css
-rw-r--r--. 1 root root  2066 Dec  7 19:21 tomcat.gif
-rw-r--r--. 1 root root  5103 Dec  7 19:21 tomcat.png
-rw-r--r--. 1 root root 67795 Dec  7 19:23 tomcat.svg
root@d17e030abc9a:/usr/local/tomcat/webapps/ROOT# echo "Hello Docker Tomcat" >> index.jsp
root@d17e030abc9a:/usr/local/tomcat/webapps/ROOT# 

浏览器访问 http://192.168.239.128:8080/,发现 Hello Docker Tomcat 显示在页面上了

Dockerfile 定制镜像

现在就有个需求,需要定制 tomcat 的镜像, 启动后页面就显示 HelloWorld!

[root@localhost /]# cd /usr/local/
[root@localhost local]# mkdir mytomcat
[root@localhost local]# cd mytomcat/
[root@localhost mytomcat]# vi Dockerfile
[root@localhost mytomcat]# cat Dockerfile 
from tomcat
workdir /usr/local/tomcat/webapps/ROOT/  #使用 workdir 而不是 cd 
run rm -rf *   # 删除ROOT目录下所有文件
run echo "Hello, Docker, Hi, HeGuang" > /usr/local/tomcat/webapps/ROOT/index.html

构建镜像

[root@localhost mytomcat]# docker build -t mytomcat .
Sending build context to Docker daemon  2.048kB
Step 1/4 : from tomcat
 ---> 6fa48e047721
Step 2/4 : workdir /usr/local/tomcat/webapps/ROOT/
 ---> Running in e9267120efc5
Removing intermediate container e9267120efc5
 ---> cd9b6d90f7ba
Step 3/4 : run rm -rf *
 ---> Running in bf40a7fa22b8
Removing intermediate container bf40a7fa22b8
 ---> 125efb0662f1
Step 4/4 : run echo "Hello, Docker, Hi, HeGuang" > /usr/local/tomcat/webapps/ROOT/index.html
 ---> Running in 221b4a3834f6
Removing intermediate container 221b4a3834f6
 ---> 526d8e59aecf
Successfully built 526d8e59aecf
Successfully tagged mytomcat:latest

查看构建的镜像

[root@localhost mytomcat]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat            latest              526d8e59aecf        12 seconds ago      507MB
tomcat              latest              6fa48e047721        2 weeks ago         507MB
mysql               5.7                 1e4405fe1ea9        5 weeks ago         437MB
[root@localhost mytomcat]# docker run -it mytomcat bash
root@ff63ff945c8f:/usr/local/tomcat/webapps/ROOT# ls -al
total 4
drwxr-xr-x. 1 root root 24 Dec 31 12:16 .
drwxr-xr-x. 1 root root 18 Dec  7 19:21 ..
-rw-r--r--. 1 root root 27 Dec 31 12:16 index.html
root@ff63ff945c8f:/usr/local/tomcat/webapps/ROOT#
镜像构建上下文(Context)

如果注意,会看到 docker build 命令最后有一个 .. 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定上下文路径。那么什么是上下文呢?

首先我们要理解 docker build 的工作原理。Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?

这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

如果在 Dockerfile 中这么写:

COPY ./package.json /app/

这并不是要复制执行 docker build 命令所在的目录下的 package.json,也不是复制 Dockerfile 所在目录下的 package.json,而是复制 上下文(context) 目录下的 package.json

因此,COPY 这类指令中的源文件的路径都是相对路径。这也是初学者经常会问的为什么 COPY ../package.json /app 或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到上下文目录中去。

现在就可以理解刚才的命令 docker build -t nginx:v3 . 中的这个 .,实际上是在指定上下文的目录,docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像。

如果观察 docker build 输出,我们其实已经看到了这个发送上下文的过程:

$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
...

理解构建上下文对于镜像构建是很重要的,避免犯一些不应该的错误。比如有些初学者在发现 COPY /opt/xxxx /app 不工作后,于是干脆将 Dockerfile 放到了硬盘根目录去构建,结果发现 docker build 执行后,在发送一个几十 GB 的东西,极为缓慢而且很容易构建失败。那是因为这种做法是在让 docker build 打包整个硬盘,这显然是使用错误。

一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。

那么为什么会有人误以为 . 是指定 Dockerfile 所在目录呢?这是因为在默认情况下,如果不额外指定 Dockerfile 的话,会将上下文目录下的名为 Dockerfile 的文件作为 Dockerfile。

这只是默认行为,实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f ../Dockerfile.php 参数指定某个文件作为 Dockerfile

当然,一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。

比如现在要复制 index.html 到定制镜像中

[root@localhost mytomcat]# ls
Dockerfile  index.html
[root@localhost mytomcat]# vi Dockerfile 
[root@localhost mytomcat]# cat Dockerfile 
from tomcat
#     上下分路径中的文件  镜像的目录
copy index.html   /usr/local/tomcat/webapps/ROOT/
[root@localhost mytomcat]# docker build -t tomcat002 .
Sending build context to Docker daemon  3.072kB
Step 1/2 : from tomcat
 ---> 6fa48e047721
Step 2/2 : copy index.html /usr/local/tomcat/webapps/ROOT/
 ---> 2fbc9185e236
Successfully built 2fbc9185e236
Successfully tagged tomcat002:latest
[root@localhost mytomcat]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat002           latest              2fbc9185e236        22 seconds ago      507MB
tomcat              latest              6fa48e047721        2 weeks ago         507MB
[root@localhost mytomcat]# docker run -it --rm tomcat002 bash
root@f25573a12089:/usr/local/tomcat# ls -al
total 124
drwxr-sr-x. 1 root staff    21 Dec 13 23:52 .
drwxrwsr-x. 1 root staff    20 Nov 23 16:34 ..
-rw-r--r--. 1 root root  19318 Dec  7 19:23 BUILDING.txt
drwxr-xr-x. 2 root root   4096 Dec 13 23:52 bin
drwxr-sr-x. 2 root root    238 Dec  7 19:23 conf
drwxr-sr-x. 2 root staff    78 Dec 13 23:52 include
drwxrwxrwx. 2 root root     30 Dec 13 23:52 temp
drwxr-xr-x. 1 root root     18 Dec  7 19:21 webapps
drwxrwxrwx. 2 root root      6 Dec  7 19:19 work
root@f25573a12089:/usr/local/tomcat# cd webapps/ROOT/
root@f25573a12089:/usr/local/tomcat/webapps/ROOT# ls -al
total 184
drwxr-xr-x. 1 root root    24 Dec 31 13:45 .
drwxr-xr-x. 1 root root    18 Dec  7 19:21 ..
-rw-r--r--. 1 root root 21630 Dec  7 19:21 favicon.ico
-rw-r--r--. 1 root root   231 Dec 31 13:41 index.html
-rw-r--r--. 1 root root 12219 Dec  7 19:23 index.jsp
-rw-r--r--. 1 root root  5103 Dec  7 19:21 tomcat.png
-rw-r--r--. 1 root root 67795 Dec  7 19:23 tomcat.svg
root@f25573a12089:/usr/local/tomcat/webapps/ROOT# 

docker-compse

安装
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

进入 /usr/local/bin 目录,会发现多了个 docker-compose,但没有x 这个权限

[root@bogon docker]# cd /usr/local/bin
[root@bogon bin]# ll
total 16776
-rw-r--r--. 1 root root 17176256 Mar 19 22:01 docker-compose

设置权限

chmod +x /usr/local/bin/docker-compose

现在就有了

[root@bogon bin]# ll
total 16776
-rwxr-xr-x. 1 root root 17176256 Mar 19 22:01 docker-compose

验证是否安装成功

[root@bogon bin]# docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
CentOS 修改 IP 和 DNS
  • 修改主机名

    #查看主机名
    hostnamectl 
    #或者
    hostnamectl status
    #或
    hostnamectl [--pretty|--static|--transient] status
    # 修改全部三种主机名
    hostnamectl set-hostname deployment
    #配置 hosts
    cat >> /etc/hosts <<EOF
    192.168.239.131 deployment
    EOF
    

    在 CentOS 7 中,主机名分3类:static(静态主机名)、pretty(好看、易读的主机名)和transient(短暂临时的)。CentOS 7中和主机名有关的文件为/etc/hostname,它是在系统初始化的时候被读取的,并且内核根据它的内容设置transient主机名。其中:

    static类的主机名就是我们常说的主机名,由/etc/hostname文件决定。

    transient类的主机名也就是我们常说的临时主机名,它是由内核动态维护的主机名。默认在系统启动的时候会根据/etc/hostname文件中的静态主机名进行初始化。

    pretty类的主机名是给人看的,它可以提供非标准的主机名,以前版本(例如CentOS 6)没有这功能。它可以包含特殊符号,例如空格。例如将pretty名称命为"MaYun’s Host",这种名称在以前的主机名(即static类主机名)里是不允许存在的

  • 修改IP

    vim /etc/sysconfig/network-scripts/ifcfg-ens33
    
  • 修改 DNS

    # 加上 nameserver 114.114.114.114
    vim /etc/resolv.conf
    # 重启网络
    systemctl restart network
    # 测试
    ping www.baidu.com
    
Ubuntu 修改 IP 和 DNS

修改ip

root@Ubuntu:~# vim /etc/netplan/50-cloud-init.yaml
# 编辑如下
network:
    ethernets:
        ens33:
          addresses: [192.168.239.132/24]
          gateway4: 192.168.239.2
          nameservers:
             addresses: [192.168.239.2] 
    version: 2
# 让 修改的 ip 生效    
root@Ubuntu:~# netplan apply

修改 cloud.cfg 防止重启后主机名还原

root@Ubuntu:~# vim /etc/cloud/cloud.cfg
# 改为true
# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: true

修改主机名

# 查看主机名
root@Ubuntu:~# hostnamectl
   Static hostname: Ubuntu
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 2b5e98aef03d4c41aab03756c370729d
           Boot ID: 4e29b4f84e884369a95e1d75f73b462d
    Virtualization: vmware
  Operating System: Ubuntu 18.04.4 LTS
            Kernel: Linux 4.15.0-91-generic
      Architecture: x86-64
#设置主机名 为 deployment      
root@deployment:~# hostnamectl set-hostname deployment
#配置 hosts
cat >> /etc/hosts <<EOF
192.168.239.132 deployment
EOF

修改DNS

root@Ubuntu:~# vim /etc/systemd/resolve.cfg
#DNS=
DNS=114.114.114.114
# 重启后主机名就会变
root@Ubuntu:~# reboot
docker-compose 安装 tomcat

所有手动安装的都放在 /usr/local/docker/目录下

[root@bogon /]# cd /usr/local
[root@bogon local]# pwd
/usr/local
[root@bogon local]# mkdir docker
[root@bogon local]# ls
bin  docker  etc  games  include  jdk1.8  lib  lib64  libexec  sbin  share  src  tmp
[root@bogon local]# cd docker
[root@bogon docker]# mkdir tomcat
[root@bogon docker]# ls
tomcat
[root@bogon docker]# mkdir mysql
[root@bogon docker]# ll
total 0
drwxr-xr-x. 2 root root 6 Mar 19 23:01 mysql
drwxr-xr-x. 2 root root 6 Mar 19 23:01 tomcat

之前是使用 docker run 来运行 tomcat, 现在使用 docker-compose,步骤如下:

# 进入 /usr/local/docker/tomcat 目录下,并新建 docker-compose.yml文件
root@deployment:/usr/local/docker/tomcat# vi docker-compose.yml
# 编辑如下
version: '3.1'
services: 
   tomcat:
      restart: always
      image: tomcat
      container_name: tomcat
      ports:
        - 8080:8080 #注意 - 后面有个空格,- 表示数组
      volumes:
        - ./webapps:/usr/local/tomcat/webapps
      environment:
        TZ: Asia/Shanghai  
# 发现多了个 webapps 目录        
root@deployment:/usr/local/docker/tomcat# ll
total 16
drwxr-xr-x 3 root root 4096 Mar 20 06:26 ./
drwxr-xr-x 3 root root 4096 Mar 20 05:43 ../
-rw-r--r-- 1 root root  253 Mar 20 06:26 docker-compose.yml
drwxr-xr-x 2 root root 4096 Mar 20 06:26 webapps/
root@deployment:/usr/local/docker/tomcat# cd webapps/
root@deployment:/usr/local/docker/tomcat/webapps# ll
total 8
drwxr-xr-x 2 root root 4096 Mar 20 06:26 ./
drwxr-xr-x 3 root root 4096 Mar 20 06:26 ../
# 新建 ROOT 目录,tomcat默认启动文件就放在这个目录....
root@deployment:/usr/local/docker/tomcat/webapps# mkdir ROOT
root@deployment:/usr/local/docker/tomcat/webapps# cd ROOT/
root@deployment:/usr/local/docker/tomcat/webapps/ROOT# ll
total 8
drwxr-xr-x 2 root root 4096 Mar 20 06:30 ./
drwxr-xr-x 3 root root 4096 Mar 20 06:30 ../
root@deployment:/usr/local/docker/tomcat/webapps/ROOT# vi index.jsp
# index.jsp 写入内容
root@deployment:/usr/local/docker/tomcat/webapps/ROOT# cat index.jsp 
Hello Docker Compose!
# 以守护态运行,这样就不用再敲 docker run 命令了...
root@deployment:/usr/local/docker/tomcat/webapps/ROOT# docker-compose up -d

之前使用 docker run 命令 启动容器,如果 用 docker rm 容器Id 删除容器就只剩下镜像了,但如果用 docker-compose 来运行实例,关闭后,/usr/local/docker目录下的数据依然还在

#关闭容器
root@deployment:/usr/local/docker/tomcat# docker-compose down
#发现没有了 tomcat 实例
root@deployment:/usr/local/docker/tomcat# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
# 但我们的数据依然还在,说明已经持久化了
root@deployment:/usr/local/docker/tomcat# ll
total 16
drwxr-xr-x 3 root root 4096 Mar 20 06:26 ./
drwxr-xr-x 3 root root 4096 Mar 20 05:43 ../
-rw-r--r-- 1 root root  253 Mar 20 06:26 docker-compose.yml
drwxr-xr-x 3 root root 4096 Mar 20 06:30 webapps/
root@deployment:/usr/local/docker/tomcat# cd webapps/
root@deployment:/usr/local/docker/tomcat/webapps# ll
total 12
drwxr-xr-x 3 root root 4096 Mar 20 06:30 ./
drwxr-xr-x 3 root root 4096 Mar 20 06:26 ../
drwxr-xr-x 2 root root 4096 Mar 20 06:31 ROOT/
root@deployment:/usr/local/docker/tomcat/webapps# cd ROOT/
# index.jsp还在
root@deployment:/usr/local/docker/tomcat/webapps/ROOT# ll
total 12
drwxr-xr-x 2 root root 4096 Mar 20 06:31 ./
drwxr-xr-x 3 root root 4096 Mar 20 06:30 ../
-rw-r--r-- 1 root root   22 Mar 20 06:31 index.jsp

docker-compose 安装 mysql

同样的,进入/usr/local/docker/mysql 目录下,新建 docker-compose.yml 文件,编辑如下:

version: '3.1'
services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root #设置密码,是不是很熟悉
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ./data:/var/lib/mysql    # /var 目录是存放数据的,还记得吧
 #MYSQL 的web 客户端(浏览器输入ip:8081 访问不起作用,不知为啥????)
  adminer:
    image: adminer
    restart: always
    ports:
      - 8081:3306  # docker 是沙箱机制,容器之间隔离的,所以使用 3306 是可以的,8080被 tomcat占用,所以..

然后 docker-compose up -d 启动,不说了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值