这里写目录标题
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 机器的数据和配置依然存在,下次重新实例化容器的时候重新指定即可,数据和配置都还在
交互的方式启动容器
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/version
和ls
分别查看当前系统的版本信息和当前目录下的文件列表
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
启动,不说了…