44docker
笔记docker
docker
-
Docker概述
-
Docker安装
-
Docker命令
- 镜像命令
- 容器命令
- 操作命令
- ....
-
Docker镜像
-
容器数据卷
-
DockerFile
-
Docker网络原理
-
IDEA整合Docker
-
Docker 集群
-
Docker Swarm
-
CI\CD Jenkins
Docker概述
Docker为什么出现?
一款产品:开发到上线 两套环境! 应用环境,应用配置
开发 ---- 运维。 问题:在我电脑上可以运行!版本更新,导致服务不可用!
环境配置十分麻烦,每一个机器都要去部署环境(集群Redis、ES、Hadoop...) 费时费力。
发布一个项目(jar+(redis MySQL jdk ES)),项目能不能带上环境安装打包!
之前在服务器配置一个应用的环境 Redis MySQL jdk ES Hadoop,配置超麻烦,不能跨平台。windows,最后发布到Linux!
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完!
java -- apk --发布(应用商店)--王二使用apk--安装即可用
java --jar(环境)--打包项目带上环境(镜像)--(Docker仓库:商店)--下载发布的镜像---直接运行即可!
Docker给以上的问题,退出了解决方案!
Docker的思想来自于集装箱!
JRE --多个应用,常见的端口冲突--原来都是交叉的
隔离:Docker核心思想!打包装箱,每个箱子之间互相隔离
举例:水果 生化武器
Docker通过隔离机制,可以将服务器利用到极致。
Docker与Vmware对比
虚拟机:在window中装一个Vmware,通过这个软件可以虚拟出一台或多太电脑 !笨重!
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种 虚拟化技术!
vm: Linux centos原生镜像(一个电脑) 隔离:需要开启多个虚拟机! 几个G 几分钟
docker: 隔离, 镜像(最核心的环境 4m + jdk + mysql)十分小巧, 运行镜像就可以了! 小巧! 几个M KB 秒级启动!
Docker能干嘛
之前的虚拟机技术
虚拟机技术缺点
1.资源占用十分多
2.冗余步骤多
3.启动很慢!
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在 宿主机的内,容器是没有自己的内核,也没有虚拟我们的硬件,所以就轻便
- 每个容器是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致
更高效的计算资源利用:
Docker是 内核 级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器的性能可以被压榨到极致
Docker安装
Docker基本组成
安装Docker
环境准备
1.需要会点Linux基础
2.Centos7
3.使用Xshell连接远程服务器进行操作
环境查看
#系统内核是3.10以上的
[root@VM-12-9-centos /]# uname -r
3.10.0-1160.71.1.el7.x86_64
# 系统版本
[root@VM-12-9-centos /]# 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"
2.移除旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务
sudo systemctl start docker
测试运行 hello-world
docker run hello-world
由于本地没有hello-world这个镜像,所以会pull一个hello-world的镜像,并在容器内运行。
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决。
配置文件加入这个即可,然后重启docker
"registry-mirrors": ["https://registry.docker-cn.com"]
删除 Docker CE
sudo yum remove docker-ce
rm -rf /var/lib/docker
run流程
底层原理
Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的熟练
docker 命令 --help # 帮助命令
镜像命令
[root@VM-12-9-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 15 months ago 13.3kB
docker search 搜索镜像
[root@VM-12-9-centos /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13607 [OK]
mariadb MariaDB Server is a high performing open sou… 5194 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 710 [OK]
percona Percona Server is a fork of the MySQL relati… 597 [OK]
bitnami/mysql Bitnami MySQL Docker Image 80
docker pull 下载镜像
例如:下载最新镜像
指定版本下载
docker rmi 删除镜像
(rm 删除 i值images(镜像))
[root@VM-12-9-centos /]# docker rmi 镜像id # 通过id删除指定的镜像
[root@VM-12-9-centos /]# docker rmi 镜像id 镜像id 镜像id # 删除多个镜像
[root@VM-12-9-centos /]# docker rmi -f $(docker images -aq) # 删除所有镜像
容器命令
说明:我们有了镜像就可以创建容器,linux,下载一个centos镜像来测试学习
[root@VM-12-9-centos /]# docker pull centos
新建容器并启动
[root@VM-12-9-centos /]# docker run [可选参数] images
启动容器
列出所有的运行的容器
[root@VM-12-9-centos /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-12-9-centos /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdeaa9cb4d8d centos "/bin/bash" 6 minutes ago Exited (0) 56 seconds ago epic_merkle
1691d42a8cb0 feb5d9fea6a5 "/hello" 2 hours ago Exited (0) 2 hours ago cranky_goldstine
2a4932baa99a feb5d9fea6a5 "/hello" 2 hours ago Exited (0) 2 hours ago gracious_darwin
[root@VM-12-9-centos /]#
退出容器
exit #直接容器停止并退出
ctrl + P + Q # 容器不停止退出
删除容器
将未启动的容器删除
启动和停止容器的操作
常用其它命令
查看日志
查看容器中进程信息
查看镜像的元数据
进入当前正在运行的容器
# 我们通常容器都是是由后台方式运行的,需要进入容器,修改一些配置
# 命令
方式一:docker exec -it 容器id bashShell
# 测试
[root@VM-12-9-centos /]# docker exec -it e40f3036a9c0 /bin/bash
[root@e40f3036a9c0 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@e40f3036a9c0 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:13 pts/0 00:00:00 /bin/bash
root 16 0 0 10:16 pts/1 00:00:00 bin/bash
root 31 16 0 10:17 pts/1 00:00:00 ps -ef
# 方式二
# docker attach 容器id
[root@VM-12-9-centos /]# docker attach e40f3036a9c0 # 正在执行当前的代码....
[root@e40f3036a9c0 /]#
#docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach # 进入正在执行的终端,不会启动新的进程!
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
# 测试如下
[root@c1fc971a0ad9 home]# touch a.java # 在内部新建一个a.java文件
[root@c1fc971a0ad9 home]# ls
a.java
[root@c1fc971a0ad9 home]# exit
exit
[root@VM-12-9-centos /]# docker ps -a # 查看历史run的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1fc971a0ad9 centos "/bin/bash" About a minute ago Exited (0) 16 seconds ago tender_ride
e40f3036a9c0 centos "/bin/bash" 22 minutes ago Exited (127) 5 minutes ago dreamy_beaver
c28710f7e355 centos "-it /bin/bash" 22 minutes ago Created great_mirzakhani
7f47951bc6d9 centos "-it /bin/bsah" 22 minutes ago Created recursing_wescoff
fdeaa9cb4d8d centos "/bin/bash" 2 hours ago Exited (0) 2 hours ago epic_merkle
1691d42a8cb0 feb5d9fea6a5 "/hello" 4 hours ago Exited (0) 4 hours ago cranky_goldstine
2a4932baa99a feb5d9fea6a5 "/hello" 4 hours ago Exited (0) 4 hours ago gracious_darwin
[root@VM-12-9-centos /]# cd /home
[root@VM-12-9-centos home]# pwd
/home
[root@VM-12-9-centos home]# ls # 查看当前主机目录下
lighthouse
[root@VM-12-9-centos home]# ll
total 4
drwx------ 3 lighthouse lighthouse 4096 Nov 20 20:26 lighthouse
[root@VM-12-9-centos home]# docker cp c1fc971a0ad9:/home/a.java /home # 开始拷贝
[root@VM-12-9-centos home]# ls
a.java lighthouse
[root@VM-12-9-centos home]#
# 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现
小结
熟能生巧 docker --help
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
练习
https://hub.docker.com/ docker仓库
作业1.docker安装nginx
# 1.搜索镜像 search 可以去docker hub搜索,也可以用命令
# 2.下载镜像 pull
# 3.运行测试
[root@VM-12-9-centos home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1403e55ab369 2 days ago 142MB
centos latest 5d0da3dc9764 15 months ago 231MB
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[root@VM-12-9-centos home]# docker run -d --name nginx -p 3344:80 nginx
650396e599becf7d18f89994c043782945507bdc1b38b84f0c95f548ea5d88a0
[root@VM-12-9-centos home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
650396e599be nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 80/tcp, 0.0.0.0:3344->81/tcp, :::3344->81/tcp nginx
测试成功!
进入容器
[root@VM-12-9-centos home]# docker exec -it 9ca3a6a8175f /bin/bash
root@9ca3a6a8175f:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@9ca3a6a8175f:/# cd /etc/nginx
root@9ca3a6a8175f:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@9ca3a6a8175f:/etc/nginx#
端口暴露的概念
作业2:docker安装一个tomcat
# 官方的使用
$ docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器,容器还是可以查到 , docker run -it --rm 一般用来测试,用完即删。
# 下载再启动
docker pull tomcat:9.0
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
####### 出现404 先把webapps删除,再把webapps.dist 改名 为webapps
docke镜像详解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像 DockerFile
docke镜像加载原理
分层理解
commit镜像
容器数据卷
什么是容器数据卷
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
测试文件的同步
再来测试
1、停止容器
2、宿主机上修改文件
3、启动容器
4、容器内的数据依旧是同步的!
好处:以后修改只需在本地修改即可,容器内会自动同步!
实战:安装MySQL
思考:MySQL的数据持久化问题
# 获取镜像
[root@VM-12-9-centos home]# docker pull mysql:5.7
# 运行容器,需要数据挂载! # 安装启动mysql,需要配置密码的,这是要注意点!
# 官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动我们的
(-d 后台运行’ -p设置端口号 —e配置环境 -v卷挂载 --name容器名字)
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 启动成功后,本地用navicat连接测试
# navicat-连接到服务器的3310 ---3310 和 容器内的 3306映射,这个时候我们就可以连接上了!
# 在本地测试创建一个数据库(test),查看一下我们映射的路径是否ok!
假设我们将容器删除
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器化持久化功能!
具名和匿名挂载
初识Dockefile
DockerFile
DockerFile介绍
很多官方镜像都是基础包,很多功能没有,通常自己会给自己搭建镜像
DockerFile构建过程
基础知识
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
构建过程
DockFile的指令
创建一个自己的centos
使用docker history 镜像id # 可查看镜像生成历史
CMD 和 ENTRPOINT 区别
小结
本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/17001851.html