Docker 基础及使用

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 版本太老啦! 推荐使用 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

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 默认页面

Docker 基础及使用_第1张图片

PS : 这里可以注意到,CentOS 的防火墙自动开放了 Nginx 的端口。可以看下这个讨论,感觉说明的挺详细的。很有意思的机制。


进阶

自定义镜像 ( 使用 DockerFile ,示例 : Oracle JDK 8 + Tomcat 9)

镜像提供的挺丰富的,那为啥要定义镜像呢? 因为提供的不满足我的需求。

示例 : 基于 Oracle Java 的镜像,比较麻烦。 那我自定义好啦 ~

Docker 基础及使用_第2张图片

准备阶段

拉取镜像,作为 基础镜像(找个操作系统版本一致的吧~)

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, 显示页面如下

Docker 基础及使用_第3张图片

网络

容器是完全使用沙箱机制,相互之间不会有任何接口(来源)。因此两个容器之间默认是不可以进行通讯的。如需要容器之间进行通讯,需要进行网络设置。在不通过主机 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

登录成功,可以正常使用啦!

Dockerfile 参考

Dockerfile命令详解

Dockerfile ADD 指令详解

你可能感兴趣的:(DevOps,docker,dockerfile,docker,网络,docker,端口,User-defined)