文章目录
- 1.docker概述
- 为什么出现docker
- 简介
- 虚拟机
- 容器化
- DevOps
- 名词概念
- 安装docker
- 卸载docker
- 镜像加速
- hello-world流程
- docker 如何工作
- docker为甚比VM快
- 2.docker命令
- 帮助命令
- **镜像命令**
- 容器命令
- 新建容器并启动
- docker run
- docker ps
- 退出容器
- 删除容器
- 启动和停止容器
- 其他命令
- run -d
- docker logs
- 查看容器进程信息
- 查看docker元信息
- 进入容器
- 从容器拷贝文件到虚拟机
- 总结
- 安装镜像并启动
- nginx
- tomcat
- ElasticSearch
- 可视化工具
- portainer
- Rancher (CI\CD)
- 3.docker镜像
- 分层理解
- 剖析
- docker commit
1.docker概述
为什么出现docker
- 解决问题:
- 生产环境搭建的复杂,复杂的集群:Redis Hadoop ES。
- 不能跨平台。
- docker:连带环境一起打包发布;开发打包部署上线。
- 举例
- java–apk – 发布-使用安装apk
- java-jar-打包项目带上环境-docker仓库–下载镜像–直接运行
- 核心思想:隔离。通过隔离机制,将服务器利用到极致。
- 打包装箱,每个箱子互相隔离的。
简介
- 镜像:系统最核心的环境 4M+java+mysql。
- docker:基于GO开发。
- 官网:https://www.docker.com/
- 文档:https://docs.docker.com/
- 仓库:https://hub.docker.com/
虚拟机
- 资源占用多
- 冗余步骤多
- 启动慢
容器化
- 不是模拟完整的操作系统,只是核心的环境
- 直接运行在宿主机的内核,容器是没有自己内核的,没有虚拟自己的硬件;
- 每个容器间是互相隔离的,每个容器都有自己文件系统,互不影响
DevOps
- 更快速的交付、部署
- docker:打包镜像发布测试,一键运行
- 更便捷的升级和扩缩容
- 部署应用和搭积木一样
- 更简单的系统运维
- 在我的电脑是什么环境,部署的就是什么环境。
- 更高效的计算资源利用
- docker是内核级别的虚拟化,一个物理机可以部署多个实例,提高资源的使用率。
名词概念
- 镜像 image
- docker镜像好比一个模板,通过模板创建容器服务
- tomcat镜像–run – tomcat01容器,提供服务器
- 容器 container
- docker利用容器技术,独立运行一个或一组应用
- 基本命令:启动 停止 删除—简单的linux系统
- 仓库 repository
- 存放镜像的地方。公有仓库、私有仓库
- 国内配置镜像加速
安装docker
- 环境服务器查看
- 要求linux系统内核在3.8或更高的版本
[root@VM_0_13_centos ~]# uname -r
5.6.10-1.el7.elrepo.x86_64
[root@VM_0_13_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"
- 安装
# 卸载旧的docker -- 直接参考官网手册
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 升级工具
$ sudo yum install -y yum-utils
# 设置镜像
yum-config-manager \--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新软件包
yum makecache fast
# 安装docker ce 社区版,ee 企业版
sudo yum install docker-ce docker-ce-cli containerd.io
安装指定版
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 启动查看docker
systemctrl start docker
docker version
docker run hellp-world -- 没有就会自动去仓库下载
# 查看镜像
[root@VM_0_13_centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 1c35c4412082 7 days ago 1.22MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
卸载docker
卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
删除文件
rm -rf /var/lib/docker
/var/lib/docker 是 docker的默认工作路径。
删除all镜像
docker rmi -f $(docker images -aq)
# 删除all容器
docker rm -f $(docker ps -aq)
镜像加速
- 阿里云镜像加速:参照官网手册
- 腾讯云镜像加速
# 创建或修改 /etc/docker/daemon.json 文件,并写入以下内容:
vi /etc/docker/daemon.json
{"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]}1
# 依次执行以下命令,重新启动 Docker 服务。
sudo systemctl daemon-reload
sudo systemctl restart docker
#检查加速器是否生效
# 执行 docker info 命令,返回结果中包含以下内容,则说明配置成功。
Registry Mirrors:
https://mirror.ccs.tencentyun.com
hello-world流程
[root@VM_0_13_centos ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
docker 如何工作
- docker是CS结构,docker的守护进程运行在宿主机上,通过socket访问。
- docker-server 接收到docker-client的命令,就会执行它
docker为甚比VM快
- docker比虚拟机少很多抽象层
- docker用的宿主机的内核,VM用的是guest os
docker新建一个容器的时候,不需要加载一个操作系统的内核,避免引导,是利用宿主机内核,省略了这个复杂的过程。
2.docker命令
帮助命令
docker version # 版本信息
docker info # docker的系统信息,更详细
docker 命令 --help
- 手册 https://docs.docker.com/reference/
镜像命令
- docker images – 查看所有本地主机上的镜像
参数 -aq :只显示id
- docker search 镜像
docker search mysql --filter=STARS=3000 搜索大于3000的
- docker pull 下载镜像
- 默认下载最新的镜像
- docker pull mysql:5.7 --指定版本
[root@VM_0_13_centos ~]# docker pull mysql
Using default tag: latest -- 不写tag 默认下载最新的
latest: Pulling from library/mysql
8559a31e96f4: Pull complete -- docker的核心,分层下载。--联合文件系统
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
c75914a65ca2: Pull complete
1ae8042bdd09: Pull complete
453ac13c00a3: Pull complete
9e680cd72f08: Pull complete
a6b5dc864b6c: Pull complete
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6-- 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest -- 真实地址
docker pull mysql 等价于
docker pull docker.io/library/mysql:latest
- docker rmi -f image_id – 删除镜像
- 删除所有 docker rmi -f $(docker images -aq)
- 删除多个 ID以空格分开
[root@VM_0_13_centos ~]# docker rmi -f 9cfcce23593a
Untagged: mysql:5.7
Untagged: mysql@sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854
Deleted: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a
Deleted: sha256:98de3e212919056def8c639045293658f6e6022794807d4b0126945ddc8324be
Deleted: sha256:17e8b88858e400f8c5e10e7cb3fbab9477f6d8aacba03b8167d34a91dbe4d8c1
Deleted: sha256:c04c087c2af9abd64ba32fe89d65e6d83da514758923de5da154541cc01a3a1e
Deleted: sha256:ab8bf065b402b99aec4f12c648535ef1b8dc954b4e1773bdffa10ae2027d3e00
[root@VM_0_13_centos ~]# docker images
容器命令
- 有镜像才能创建容器,新建一个centos镜像学习。
新建容器并启动
docker run
- –name 给容器命名,区分容器
- -d 后台运行
- -i -t 使用交互方式,进入容器运行命令
- -p 指定容器端口
- -p ip:主机端口:容器端口
- -p 主机端口:容器端口 常用
- -p 容器端口
- 容器端口
- -P 随机指定端口
- exit 从容器中退出到宿主机
[root@VM_0_13_centos ~] docker run -it centos /bin/bash -- 运行
[root@2ceab7375f22 /] ls # 2ceab7375f22容器ID
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
docker ps
- 列出当前正在运行的容器
- -a 列出历史运行的容器
- -n=1 只显示一个
- -q 只显示编号
[root@VM_0_13_centos ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ceab7375f22 centos "/bin/bash" 3 minutes ago Exited (127) About a minute ago peaceful_wozniak
[root@VM_0_13_centos ~]# docker ps -aq
2ceab7375f22
f03ef941ed02
fa59f7c1df48
06dce17c951d
863ec27773fa
e77bea413499
056b58919a03
退出容器
- exit 停止并退出容器
- ctrl+P+Q 不停止退出容器
[root@VM_0_13_centos ~]# docker run centos -it /bin/bash
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-it\": executable file not found in $PATH": unknown.
[root@VM_0_13_centos ~]# docker run -it centos /bin/bash
[root@c2d9ae9429d9 /]# [root@VM_0_13_centos ~]#
[root@VM_0_13_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2d9ae9429d9 centos "/bin/bash" 18 seconds ago Up 17 seconds nifty_bassi
删除容器
- docker rm id – 删除指定的容器
- docker rm -f $(docker ps -aq) – 删除所有的容器
- 不能删除正在运行的容器,要强制删除 rm -f
- docker ps -aq | xargs docker rm – 删除所有的容器
启动和停止容器
- docker start id
- docker restart id
- docker stop id – 停止
- docker kill id – 强制停止
其他命令
run -d
[root@VM_0_13_centos ~]# docker run -d centos
272e0a0f31b6a7ef921d53b116acd4d99102f042691429b44216856ffcc8011c
[root@VM_0_13_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 坑:docker采用后台运行,必须有一个前台进程,否则就会自动停止
- 配置nginx,容器启动后发现自己没有提供服务,就会立刻停止,就没有应用了
docker logs
- docker logs -tf --tail 10 18b8691c52b6
- docker logs -f -t 5df65c5f60c8 – 查看所有日志
[root@VM_0_13_centos ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42
minutes)
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps # 显示时间戳
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for
42 minutes)
- 写脚本不断输出:docker run -d centos /bin/sh -c “while true;do echo machine;sleep 1;done”
- docker ps 找到容器ID
- 查看日志: docker logs -f -t --tail 10 5df65c5f60c8
查看容器进程信息
- docker top 容器id
查看docker元信息
- docker inspect 容器ID
进入容器
- 进去当前正在运行的容器:
- 方法1:docker exec -it 5df65c5f60c8 /bin/sh
- 进入容器之后开启一个新终端,可以在里面操作
- 方法2: docker attach 容器ID – 进入正在运行的命令行
[root@VM_0_13_centos ~]# docker attach 5df65c5f60c8
machine
machine
从容器拷贝文件到虚拟机
- docker cp 容器ID:容器内路径 目的主机路径
- 拷贝是一个手动的过程,未来使用 -v 数据卷的技术实现自动同步。
docker run -it centos /bin/sh # 启动容器
touch /home/test.txt # 创建文件
exit # 退出。容器存在则文件一直存在的
docker ps -a -n=1 # 找到容器
docker cp 450d80483549:/home/test.java /home # 拷贝
总结
docker是传统的CS架构分为docker client和docker server,向mysql一样
- 查看下面命令的执行
docker的镜像管理
查看镜像列表:
docker images
docker image ls
导出镜像:
docker image save centos > docker-centos6.9.tar.gz
导入镜像:
docker image load -i docker-centos6.9.tar.gz
删除镜像:
docker image rm centos:latest
docker image rm 578c3
搜索镜像 docker search + 镜像名字
给源中镜像打标签:
docker tag nginx:latest 10.0.0.11:80/nginx:latest
推送指定镜像到docker镜像源服务器
docker push 10.0.0.11:80/nginx:latest
获取镜像 (下载) docker pull image_name
私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
docker history image_name 显示一个镜像的历史
docker build -t <image-name> . *(点一定不能去掉)#使用当前目录下的Dockerfile构建镜像
docker的容器管理
docker -v #查看版本
docker info #查看docker信息
运行容器
docker run --name 容器名 -d -p 3306:3306 mysql docker 启动容器
docker run image_name
docker run -d -p 80:80 nginx:latest
run(创建并运行一个容器)
-d 放在后台
-p 端口映射 :docker的容器端口
-P 随机分配端口
-v 源地址(宿主机):目标地址(容器)
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
docker run image_name 启动容器
docker stop container_id 停止容器
docker kill container_name 杀死容器
docker ps (-a -l -q) 查看容器列表
docker container rm 'docker ps -a -q' 删除所有容器
docker rm -f 'docker ps -a -q` #删除所有容器
docker ps -a #查看容器列表
docker exec -it 77cd6bef4dc9 /bin/bash #进容器
docker start/stop container-id||container-name 开启/停止 指定容器id或者容器名称的容器
docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
docker logs container-name/container-id #查看容器日志
docker ps | grep ${CONTAINER_ID} #查看容器状态
docker commit ID new_image_name #镜像打包 (保存对容器的修改)
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
docker inspect <id/container_name> #查看容器内部详情细节
docker login #登录
Ctrl+P+Q #退出而不关闭容器
安装镜像并启动
流程
- 在dockerhub搜索镜像,方便指定版本号
- 拉取镜像 pull
- 启动容器,指定参数
- 运行测试
nginx
docker search nginx -- 搜索版本
docker pull nginx --下载最新
docker run -d--name nginx01 -p 3344:80 nginx # 后台运行 名字 端口
docker ps -- 查看启动的容器
curl localhost:3344 -- 访问测试
# 操作
docker exec -it edf58ac7947c /bin/bash
whereis nginx
cd /etc/nginx
ls
- 问题:每次修改配置都要进入到docker ,使用数据卷可以在容器外部修改。
tomcat
- 官方仓库上的dockers镜像 的 Linux 大多被阉割过;没有webapps下的目录
- 默认是最小的镜像,将所有不必要的剔除。
docker run -it --rm tomcat:9.0
docker run -it --rm -p 8888:8080 tomcat:9.0
# --rm 用完就删除;
[root@VM_0_13_centos home]# docker exec -it 6c1179ed0a45 /bin/bash
root@6c1179ed0a45:/usr/local/tomcat# lss
bash: lss: command not found
root@6c1179ed0a45:/usr/local/tomcat# ls -sl
total 152
20 -rw-r--r-- 1 root root 18982 May 5 20:40 BUILDING.txt
8 -rw-r--r-- 1 root root 5409 May 5 20:40 CONTRIBUTING.md
56 -rw-r--r-- 1 root root 57092 May 5 20:40 LICENSE
4 -rw-r--r-- 1 root root 2333 May 5 20:40 NOTICE
4 -rw-r--r-- 1 root root 3255 May 5 20:40 README.md
8 -rw-r--r-- 1 root root 6898 May 5 20:40 RELEASE-NOTES
16 -rw-r--r-- 1 root root 16262 May 5 20:40 RUNNING.txt
4 drwxr-xr-x 2 root root 4096 May 16 12:05 bin
4 drwxr-xr-x 1 root root 4096 Jun 10 06:41 conf
4 drwxr-xr-x 2 root root 4096 May 16 12:05 lib
4 drwxrwxrwx 1 root root 4096 Jun 10 06:41 logs
4 drwxr-xr-x 2 root root 4096 May 16 12:05 native-jni-lib
4 drwxrwxrwx 2 root root 4096 May 16 12:05 temp
4 drwxr-xr-x 2 root root 4096 May 16 12:05 webapps
4 drwxr-xr-x 7 root root 4096 May 5 20:37 webapps.dist
4 drwxrwxrwx 2 root root 4096 May 5 20:36 work
root@6c1179ed0a45:/usr/local/tomcat# cd webapps
root@6c1179ed0a45:/usr/local/tomcat/webapps# ls
root@6c1179ed0a45:/usr/local/tomcat/webapps#
## 解决剔除的文件:
cp -r webapps.dist/* webapps
# 重新访文
ElasticSearch
- es暴露端口多、占用内存多.启动了虚拟机就会很卡。
- es的数据一般挂载到安全目录
- – net somenetwork 网络配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
docker stats # 查看CPU状态
# 添加限制
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx256M" elasticsearch:7.6.2
可视化工具
portainer
- docker的图形界面管理工具
- 用到的较少
- 第一次访问,先自己设定密码
docker run -d -p 8088:9000 --name portainer --restartalways -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --privileged=true portainer/portainer
Rancher (CI\CD)
- 这个可视化工具 在 持续集成 持续部署的时候用到。
3.docker镜像
- 联合文件系统:一层一层的添加环境,其他容器有了,新容器就不需要加了。
有2个主要的概念: - bootfs:引导作用,加载centos内核,大家公用的
- rootfs:不同的发行版,精简过。
分层理解
- 分层好处:有些系统的层是相同的,可以直接复用,不用再下载了。
- docker镜像都是只读的,只有当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是我们通常说的容器层,容器之下的都是镜像层。
- docker inspect nginx:latest 查看
剖析
- 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。
- 对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。
- Namespace 的使用方式也非常有意思:它其实只是 Linux 创建新进程的一个可选参数。在 Linux 系统中创建线程的系统调用是 clone();在参数中指定 CLONE_NEWPID 参数。这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID 是 1。之所以说“看到”,是因为这只是一个“障眼法”,在宿主机真实的进程空间里,这个进程的 PID 还是真实的数值,比如 100。
- 除了 PID Namespace,Linux 操作系统还提供了 Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行“障眼法”操作。
- Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合- 挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。它还有一个更为专业的名字,叫作:rootfs(根文件系统)。
rootfs 只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。在 Linux 操作系统中,这两部分是分开存放的,操作系统只有在开机启动时才会加载指定版本的内核镜像- Docker 在镜像的设计中,引入了层(layer)的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。
– 摘自:极客时间《深入剖析Kubernetes》
docker commit
- docker commit 提交容器成为一个新的副本
- docker commit -m=“描述信息” -a =“作者” 容器ID 目标镜像名,[TAG]
- 好比拍一个快照,保存
docker run -it -p 8080:8080 tomcat:8.5 # 容器内是8080端口
docker ps # 查看容器ID
docker exec -it id /bin/bash # 进到容器里面,部署应用
cp -r weapps.dist/* webapps
exit
[root@VM_0_13_centos ~]# docker commit -a="macheine" -m="add tomcat app" 456053d77d85 tomcat02:1.0 # 提交为一个新的镜像。到本地
sha256:807d99ba0834b3858c0942253d416b3a53bb353e11d4623ba532adc76b9adfb5
[root@VM_0_13_centos ~]# docker images# 查看
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 807d99ba0834 6 seconds ago 534MB
nginx latest 2622e6cca7eb 17 hours ago 132MB
portainer/portainer latest cd645f5a4769 8 days ago 79.1MB
tomcat 8.5 f19c56ce92a8 3 weeks ago 529MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB