Docker
Docker 的学习
- Docker概述
- Docker安装
- Docker命令
- 镜像命令
- 容器命令
- 操作命令
- …
- Docker镜像
- 容器数据卷
- DockerFile
- Docker网络原理
- IDEA整合Docker
- Docker Compose
- Docker Swarm
- CI\CD jenkins
Docker概述
Docker为什么出现
开发 ---- 运维 ,问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大。
环境配置十分麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop、…)费时费力!
发布一个项目(jar+(Redis MySQL jdk …)),可能需要一天 。一旦某个环境配置有误,可能需要从头来过。
那么项目能不能都带上环境安装打包?
Docker给这些问题,提出了解决方案!
Java – apk – 发布到应用商店 – 使用apk – 安装即可使用
Java – jar(环境) – 打包项目带上环境(镜像) – DockerHub(仓库:商店)-- 下载发布的镜像 – 直接运行即可!
Docker的思想来自于集装箱
多个应用可能会遇到端口冲突
隔离:Docker核心思想,打包装箱,每一个箱子互相隔离。
Docker通过隔离机制,可以将服务器利用到极致。
Docker的历史
Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。
2013年,Docker开源!Docker越来越多的人发现了Docker的优点。火了!
2014年,Docker1.0发布!
在容器技术出来之前,我们都是使用虚拟机技术
虚拟机:在Windows装一个Vmware,通过这个软件我们可以虚拟出来一台或多台电脑!不过十分笨重。
Docker容器技术也是一种虚拟化技术。
docker:最核心的环境,几兆就能满足,十分的小巧。秒级启动!
聊聊Docker
Docker是基于Go语言开发的开源项目!
文档地址:https://docs.docker.com/ Docker的文档是很详细的!
百度百科:
https://baike.baidu.com/item/Docker/13344470?fr=aladdin
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
。。。。。。
Docker能干嘛
虚拟化技术缺点:
1.资源占用十分多
2.冗余步骤多
3.启动很慢!
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟化技术的不同:
- 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内核,容器是没有自己的内核,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
Docker安装
安装Docker
环境准备
1.需要一点点的Linux基础
2.ContOS 7
3.使用Xshell连接远程服务器
环境查看
[root@izuf65ldvcyvaasah4k2a6z ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
Docker安装在centos的文档:https://docs.docker.com/engine/install/centos/
# 1.卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.需要的安装包
yum install -y yum-utils
# 3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是从国外的
# 推荐使用阿里云的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
[root@izuf65ldvcyvaasah4k2a6z ~]# yum makecache fast
# 4.安装docker相关的内容 docker-ce 社区版
yum install docker-ce docker-ce-cli containerd.io
# 5.启动docker
[root@izuf65ldvcyvaasah4k2a6z ~]# systemctl start docker
# 6.使用docker version
[root@izuf65ldvcyvaasah4k2a6z ~]# docker version
Client: Docker Engine - Community
Version: 19.03.11
API version: 1.40
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:13:48 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:12:26 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
# 7.hello world
[root@izuf65ldvcyvaasah4k2a6z ~]# docker run hello-world
# 8.查看下下载的hello-world镜像
[root@izuf65ldvcyvaasah4k2a6z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 9b188f5fb1e6 5 months ago 98.2MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
mysql 5.7 1e4405fe1ea9 7 months ago 437MB
阿里云镜像加速
1.登录阿里云账户找到容器镜像服务
网址:https://www.aliyun.com/
2.找到镜像加速地址
3.配置使用
# 阿里云内部的加速器,每个人都不一样
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://57torq4r.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker的常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档:https://docs.docker.com/reference/
镜像命令
docker images 查看所有本地的主机上的镜像
[root@izuf65ldvcyvaasah4k2a6z ~]# clear
[root@izuf65ldvcyvaasah4k2a6z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 9b188f5fb1e6 5 months ago 98.2MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
mysql 5.7 1e4405fe1ea9 7 months ago 437MB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, --all # 列出所有的镜像
-q, --quiet #只显示镜像的id
[root@izuf65ldvcyvaasah4k2a6z ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter 根据提供的条件过滤输出
--format string 使用Go模板进行漂亮的打印搜索
--limit int 最大搜索结果数(默认为25)
--no-trunc 不截断输出
[root@izuf65ldvcyvaasah4k2a6z ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9650 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3510 [OK]
docker pull 下载镜像
# 下载镜像 docker pull 镜像名(:tag)
[root@izuf65ldvcyvaasah4k2a6z ~]# docker pull mysql 如果不写tag,默认下载最新
docker rmi 删除镜像
[root@izuf65ldvcyvaasah4k2a6z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 9b188f5fb1e6 5 months ago 98.2MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
mysql 5.7 1e4405fe1ea9 7 months ago 437MB
[root@izuf65ldvcyvaasah4k2a6z ~]# docker rmi -f bf756fb1ae65
。。。。。。
[root@izuf65ldvcyvaasah4k2a6z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 9b188f5fb1e6 5 months ago 98.2MB
mysql 5.7 1e4405fe1ea9 7 months ago 437MB
[root@izuf65ldvcyvaasah4k2a6z ~]# docker rmi -f $(docker images -aq) 删除全部的镜像
容器镜像
下载一个centos镜像测试
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="name" 容器名字 ,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
#测试 启动并进入容器
[root@izuf65ldvcyvaasah4k2a6z ~]# docker run -it centos /bin/bash
[root@663303de85b9 /]#
列出所有运行的容器
docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+历史运行过的容器
-n=? #显示最近创建的容器
退出容器
exit # 直接容器停止并退出
Ctrl + p + q # 容器不停止退出
删除容器
docker rm id #删除一个容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
查看容器中的进程信息
[root@izuf65ldvcyvaasah4k2a6z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cf1746a6da6 centos "/bin/bash" 41 seconds ago Up 40 seconds suspicious_pascal
[root@izuf65ldvcyvaasah4k2a6z ~]# docker top 7cf1746a6da6
UID PID PPID C STIME TTY TIME CMD
root 29213 29197 0 20:52 pts/0 00:00:00 /bin/bash
[root@izuf65ldvcyvaasah4k2a6z ~]#
查看镜像的源数据
[root@izuf65ldvcyvaasah4k2a6z ~]# docker inspect 7cf1746a6da6
**进入当前正在运行的容器 **
# 通常容器都是后台运行,有时需要进入容器,修改一些配置
# 命令
[root@izuf65ldvcyvaasah4k2a6z ~]# docker exec -it 7cf1746a6da6 /bin/bash
# 方式二
[root@izuf65ldvcyvaasah4k2a6z ~]# docker attach 7cf1746a6da6
# docker exec # 进入容器后开启一个新的终端
# docker attach # 进入容器正在执行的终端,不会启动新的终端
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的地主机路径
[root@izuf65ldvcyvaasah4k2a6z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cf1746a6da6 centos "/bin/bash" 13 minutes ago Up 13 minutes suspicious_pascal
[root@izuf65ldvcyvaasah4k2a6z ~]# docker attach 7cf1746a6da6
[root@7cf1746a6da6 /]# cd /home
[root@7cf1746a6da6 home]# ls
[root@7cf1746a6da6 home]# touch test.java
[root@7cf1746a6da6 home]# exit
exit
[root@izuf65ldvcyvaasah4k2a6z ~]# docker ps
\CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izuf65ldvcyvaasah4k2a6z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cf1746a6da6 centos "/bin/bash" 20 minutes ago Exited (0) 9 seconds ago suspicious_pascal
[root@izuf65ldvcyvaasah4k2a6z ~]# docker cp 7cf1746a6da6:/home/test.java /home
[root@izuf65ldvcyvaasah4k2a6z ~]# cd /home
[root@izuf65ldvcyvaasah4k2a6z home]# ls
admin test.java
[root@izuf65ldvcyvaasah4k2a6z home]#
练习
Docker安装Nginx
仓库里找对应的版本:https://hub.docker.com/_/nginx
# 1.搜索镜像
[root@izuf65ldvcyvaasah4k2a6z home]# docker search nginx
# 2.下载镜像
[root@izuf65ldvcyvaasah4k2a6z home]# docker pull nginx
# 3.查看是否下载好,运行镜像
[root@izuf65ldvcyvaasah4k2a6z home]# docker images
[root@izuf65ldvcyvaasah4k2a6z home]# docker run -d --name nginx01 -p 8090:80 nginx
# 4.本机测试
curl localhost:8090
# 5.外网测试
http://你自己的公网IP地址:8090/
# 进入容器
[root@izuf65ldvcyvaasah4k2a6z home]# docker exec -it nginx01 /bin/bash
root@1c117a53713a:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@1c117a53713a:/# cd /etc/nginx
root@1c117a53713a:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@1c117a53713a:/etc/nginx#
Docker 安装tomcat
[root@izuf65ldvcyvaasah4k2a6z home]# docker pull tomcat:9.0
[root@izuf65ldvcyvaasah4k2a6z home]# docker run -d --name tomcat01 -p 8081:8080 tomcat:9.0
# 外网测试
http://你自己的公网IP地址:8081/
问题
tomcat没有显示正常的页面,阿里云镜像的原因,默认是最小的镜像,不必要的都剔除了
# 进入容器内
[root@izuf65ldvcyvaasah4k2a6z home]# docker exec -it tomcat01 /bin/bash
# 拷贝 webapps.dist下的所有文件到webapps
root@e4e40c0812b9:/usr/local/tomcat# cp -r webapps.dist/* webapps