Docker 基础及使用
- 环境&组件说明
- 基础
- 概括
- 安装
- images(镜像,示例 : Nginx)
- container(容器,示例 : Nginx)
- 进阶
- 自定义镜像 ( 使用 DockerFile ,示例 : Oracle JDK 8 + Tomcat 9)
- 准备阶段
- 构建镜像
- 网络
- User-defined networks(用户自定义的网络,默认 bridge 模式)
- 测试
- 端口
- 其他常用的容器(简单使用)
- MySQL
- 5.5
- 8
- 异常处理
- 其他常用命令
- 批量删除容器(当前运行的)
- 数据卷
- 基础命令
- 进入正在运行的容器,并以命令行交互
- 直接进入容器启动命令的终端,不会启动新的进程(重新进入容器)
- 在容器中打开新的终端,并且可以启动新的进程(功能更强)
- 退出容器(交互模式)
- 查看日志
- 补充内容
- 版本信息记录
- 查看 Docker 版本
- 安装
- Docker 链接私库
- Dockerfile 参考
环境&组件说明
操作系统 : CentOS Linux release 7.6.1810 (Core)
docker : 1.13.1
系统要求 : 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
images(镜像,示例 : Nginx)
查看本地镜像
docker images
结果
REPOSITORY TAG IMAGE ID CREATED SIZE
结果说明
- REPOSTITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像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
container(容器,示例 : Nginx)
以运行 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 的端口。可以看下这个讨论,感觉说明的挺详细的。很有意思的机制。
进阶
自定义镜像 ( 使用 DockerFile ,示例 : Oracle JDK 8 + Tomcat 9)
镜像提供的挺丰富的,那为啥要定义镜像呢? 因为提供的不满足我的需求。
示例 : 基于 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 的情况下,推荐使用“自定义网络”进行容器间的通讯。
User-defined networks(用户自定义的网络,默认 bridge 模式)
管理网络的命令(官网)
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里面添加规则。
其他常用的容器(简单使用)
MySQL
5.5
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
8
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 即企业版,强调安全,付费使用。
查看 Docker 版本
[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 即表示社区版(免费)
安装
安装方式与之前也有所区别,详见官方文档
Docker 链接私库
企业私库一般会配置域名,所以先更改 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