操作系统 : CentOS Linux release 7.6.1810 (Core)
docker : 1.13.1
补充说明:这个 Docker 版本太老啦! 推荐使用 CE 版!
Docker 官网(英文)
Docker 三要素
repository(仓库)、images(镜像)、container(容器)。
Docker 基本概念(中文) 已经介绍的比较详细了,虽然部分内容稍微有点老,但是并不影响理解。
Docker 命令大全
PS : 操作过程中,需要对 CentOS 7 的基础有一定的了解,之前整理了一些常用但是我经常忘记的命令。
可以参考 : CentOS 安装 docker 的官方文档 。
系统要求 : Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
查看操作系统的版本
uname -r
运行结果
3.10.0-957.el7.x86_64
检查当前是否安装 docker
docker version
systemctl status docker
安装 Docker
yum -y install docker
启动 Docker 服务
systemctl start docker
检查 docker 状态
systemctl status docker
验证,并查看版本
docker version
docker info
设置开机启动(非必须,有需要则设置)
systemctl enable docker
检查开机启动是否设置成功
systemctl list-unit-files | grep enable | grep docker
关闭开机启动(根据实际情况设置)
systemctl disable docker
查看本地镜像
docker images
结果
REPOSITORY TAG IMAGE ID CREATED SIZE
结果说明
查找镜像信息。主要用于查找 images(镜像) 相关信息,便于拉取对应的版本。
两种方法(无论哪种方法,建议使用 OFFICIAL IMAGE ):
1、网站查询 : Docker Hub
2、通过命令行查询
docker search
实例 : 搜索 nginx 镜像
docker search nginx
拉取镜像(默认 Tag : latest)
docker pull nginx
拉取成功后,查看本地镜像
docker images
显示结果
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest ae2feff98a0c 8 days ago 133 MB
以运行 Nginx 容器为示例
docker run --name nginx -p 80:80 -d nginx
说明 :
–name 为容器指定一个名称
-p 将容器内部使用的网络端口映射到我们使用的主机上(外部暴露端口:容器内部端口)
-d 让容器在后台运行
列出所有在运行的容器信息
docker ps
查询结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c2dce238eb4 nginx "/docker-entrypoin..." 23 minutes ago Up 23 minutes 0.0.0.0:80->80/tcp nginx
浏览器打开地址 IP , 显示 nginx 默认页面
PS : 这里可以注意到,CentOS 的防火墙自动开放了 Nginx 的端口。可以看下这个讨论,感觉说明的挺详细的。很有意思的机制。
镜像提供的挺丰富的,那为啥要定义镜像呢? 因为提供的不满足我的需求。
示例 : 基于 Oracle Java 的镜像,比较麻烦。 那我自定义好啦 ~
拉取镜像,作为 基础镜像(找个操作系统版本一致的吧~)
docker pull centos:7.6.1810
准备文件
apache-tomcat-9.0.39.zip
jdk-8u261-linux-x64.rpm
镜像 centos:7.6.1810 中没有 zip ,会提示
bash: zip: command not found
那就把 apache-tomcat-9.0.39.zip 文件提前处理一下,解压、重新压缩,变为 apache-tomcat-9.0.39.tar.gz(也可以在容器中使用 yum 安装,但是不推荐,会让容器变大,容器生成的自定义镜像也会变大)
unzip apache-tomcat-9.0.39.zip
tar -czf apache-tomcat-9.0.39.tar.gz ./apache-tomcat-9.0.39
新建文件夹 dockerFile 将准备的文件放在这里。新建构建文件如下
vi my_tomcat_8
文件内容(写的很渣,没什么参考价值。仅作为示例使用 !!!)
FROM centos:centos7.6.1810
MAINTAINER name email
ENV PACKAGE_HOME /usr/package/
COPY jdk-8u261-linux-x64.rpm $PACKAGE_HOME
COPY apache-tomcat-9.0.39.tar.gz /usr/
RUN cd $PACKAGE_HOME \
&& rpm -ivh jdk-8u261-linux-x64.rpm \
&& rm -rf jdk-8u261-linux-x64.rpm \
&& cd /usr/ \
&& tar -zxvf apache-tomcat-9.0.39.tar.gz \
&& rm -rf apache-tomcat-9.0.39.tar.gz
ENV TOMCAT_HOME /usr/apache-tomcat-9.0.39/
RUN chmod +x $TOMCAT_HOME/bin/*
WORKDIR $TOMCAT_HOME
VOLUME ["$TOMCAT_HOME/logs/", "$TOMCAT_HOME/webapps/"]
EXPOSE 8080
CMD $TOMCAT_HOME/bin/catalina.sh run
构建镜像
docker build -f ./my_tomcat_8 -t my_tomcat/test:8 .
以上命令说明如下(可以参考) :
docker build -f /dockerImageFile -t /nameSpace .
查看镜像(查看镜像是否按照计划成功构建)
docker images
测试是否可以正常运行
docker run --name tomcat -p 8080:8080 -d my_tomcat/test:8
浏览器输入地址 IP:8080, 显示页面如下
容器是完全使用沙箱机制,相互之间不会有任何接口(来源)。因此两个容器之间默认是不可以进行通讯的。如需要容器之间进行通讯,需要进行网络设置。在不通过主机 IP 的情况下,推荐使用“自定义网络”进行容器间的通讯。
管理网络的命令(官网)
docker network
目标 : 实现同一主机,容器之间的通讯。
创建自定义网络
docker network create user_defined_networks
查看是否创建成功
docker network ls
运行容器,并将容器加入自定义网络
tomcat 容器,用于提供服务(没有端口映射,正常无法访问)
docker run --name tomcat_no_port --network user_defined_networks --network-alias tomcat -d my_tomcat/test:8
CentOS 7 容器,用于访问 Tomcat 服务,测试网络是否畅通
docker run -it --network user_defined_networks --network-alias centos7 centos:7.6.1810 /bin/bash
说明 :
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
CentOS 容器运行之后,保持在容器命令行中,测试网络情况
curl tomcat:8080
显示结果中包含
Apache Tomcat/9.0.39
证明网络畅通。
问题 :
测试过程中,发现主机的防火墙一直在正常运行,但是并没有阻止客户端访问 docker 提供的服务端口。
原因 :
docker安装完后,会接管iptables,只要 docker run 的时候加入参数,会自动向iptables里面添加规则。
1、拉取镜像
docker pull mysql:5.5.62
2、启动容器
docker run -p 3306:3306 --name mysql5.5.62 --restart=always -e MYSQL_ROOT_PASSWORD='123456' -d mysql:5.5.62
3、访问测试
端口 : 3306
用户名 : root
密码 : 123456
1、拉取镜像
docker pull mysql:8.0.23
2、启动容器
docker run -p 3306:3306 --name mysql8.0.23 --restart=always -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.23
3、访问测试
端口 : 3306
用户名 : root
密码 : 123456
异常提示:
client does not supprot authentication protocol requested by server
处理方法:
1、进入容器
docker exec -it mysql8.0.23 bash
2、进入 MySQL 环境
mysql -uroot -p123456
3、授权
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
4、完!可以正常使用了。
说明:
mysql_native_password 是旧的密码验证机制。
docker rm -f $(docker ps -q)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro CONTAINER_ID/NAMES
说明 :
ro : read only (不加,默认 rw )
提示 : Permission denied,则需要容器运行时加 -privileged=true (推荐) 或者 主机运行 setenforce 0 (不推荐)。
docker attach CONTAINER_ID/NAMES
docker exec -it CONTAINER_ID/NAMES bashShell
两种方法:
exit:关闭并退出容器;
Ctrl + P + Q:容器不停止退出。
docker logs -f containername
Docker CE 在 17.03 版本之前的名字是 Docker Engine,版本号 0.1.0(2013-03-23) ~ 1.13.1(2017-02-08) 详见官方文档。之后的名字 CE 和 EE。CE 即社区版(免费);EE 即企业版,强调安全,付费使用。
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:49:57 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Community 即表示社区版(免费)
安装方式与之前也有所区别,详见官方文档
企业私库一般会配置域名,所以先更改 hosts
vim /etc/hosts
# 添加内容示例如下
0.0.0.0 registry.***.net
修改配置,示例如下
/etc/docker/daemon.json
{
"insecure-registries": [
"registry.***.net",
"0.0.0.0:0"
],
"registry-mirrors": [
"https://***.mirror.aliyuncs.com"
]
}
登录
[root@localhost ~]# docker login registry.***.net
Username: ***
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
登录成功,可以正常使用啦!
Dockerfile命令详解
Dockerfile ADD 指令详解