Docker
Docker出现的原因
一般的程序开发和运维是两套环境,并且环境的配置十分麻烦,每一个机器都需要去配置和部署环境(集群redis,Es等)比较浪费时间;
如在Windows上开发,要发布到Linux上运行就十分麻烦,但使用Docker就可以很好地解决以上问题:
Java — Jar(环境)—打包项目带上环境(镜像)—Docker仓库(应用商店)—下载镜像—直接运行
Docker的思想来自于集装箱,核心思想:隔离;JRE–多个应用(端口 冲突)原来是交叉的,而Docker就是将应用打包装箱,每个箱子是互相隔离的,可以将服务器利用到极致。
虚拟机:在window中装一个VMware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
VMware : linux centos 原生镜像(一个电脑!) 隔离、需要开启多个虚拟机! 大小几个G 光运行就几分钟
docker: 隔离,镜像(最核心的环境 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧! 几个M 秒级启动!
Docker是基于go语言开发
Docker的作用
原来的虚拟机技术缺点:
- 资源占用十分多;
- 冗余步骤多;
- 启动很慢;
比较Docker和虚拟机的不同:
- 之前的虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件;
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也么没有虚拟我们的硬件,比较轻便;
- 每个容器都是互相隔离,每个容器都有属于自己的文件系统,互不影响;
传统:一堆文件,安装程序;
Docker:打包镜像发布测试,一键运行;
应用更快速的交付和部署
更便捷的升级和扩缩容
更高效的计算资源利用
Docker基本组成
**镜像(image):**类似一个模板,可以通过这个模板来创建容器服务;
**容器(container):**Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建;启动,停止,删除,基本命令;可以理解为一个简单的Linux系统;
**仓库(repository):**存放镜像的地方;分为公有和私有仓库;
安装docker
#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://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可
#5.启动docker
systemctl start docker
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world
#8.查看已经下载的镜像(从这里可以查看已有镜像的id)
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
可以使用阿里云镜像加速;
docker运行hellworld(run的流行图)
底层原理
Docker是怎么工作的
Docker问什么比虚拟机快
- Docker有着比虚拟机更少的虚拟层;
- Docker利用的是宿主机的内核,vm是需要Gust OS;
当新建一个 容器时**,docker不需要和虚拟机一样重新加载一个操作系统内核**。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟;
Docker的基本命令
帮助命令:
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像的容器和数量
docker help #帮助命令
镜像命令:
docker images #查看所有本地主机上的镜像
-a --all #列出所有的镜像
docker search #搜索信息
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
docker rmi -f 镜像id #删除指定的镜像
容器命令:
docker run 镜像id #新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
退出容器:
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
删除容器:
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作:
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
查看日志
docker logs --help
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 6666;sleep 1;done" #模拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
查看容器中进程信息:
docker top 容器ID
查看镜像的原数据
docker inspect 容器id
进入当前正在运行的容器
docker attach 容器id
docker exec -it 容器id
#docker exec #进入容器后开启一个新的终端,可以在里面操作
#docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的路径
docker安装Nginx
# 搜索镜像 search
# 下载镜像 pull
# 测试
# 1、搜索镜像
[root@localhost home]# docker search nginx
# 2、拉取镜像
[root@localhost home]# docker pull nginx
# 3、查看镜像
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62d49f9bab67 3 weeks ago 133MB
centos latest 300e315adb2f 4 months ago 209MB
# 4、启动运行
[root@localhost home]# docker run -d --name nginx01 -p 3344:80 nginx
66f84ea1a1679cc5f062e4c7aab26f051d30df710e23e7685597257933eb7d61
# 5、查看运行情况
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
66f84ea1a167 nginx "/docker-entrypoint.…" 31 seconds ago Up 29 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
# -d 后台运行
# --name 给容器起名字
# -p 宿主机端口:容器内部端口
# 6、本机自测运行情况
[root@localhost home]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 7、进入容器,修改配置
[root@localhost home]# docker exec -it nginx01 /bin/bash
root@66f84ea1a167:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@66f84ea1a167:/# cd /etc/nginx
root@66f84ea1a167:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@66f84ea1a167:/etc/nginx#
docker安装tomcat
# 下载 tomcat9.0
# 之前的启动都是后台,停止了容器,容器还是可以查到, docker run -it --rm 镜像名 一般是用来测试,用完就删除
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -it --rm tomcat:9.0
--rm Automatically remove the container when it exits 用完即删
#下载 最新版
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull tomcat
#查看下载的镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
#以后台方式,暴露端口方式,启动运行
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d -p 8080:8080 --name tomcat01 tomcat
#测试访问有没有问题
curl localhost:8080
#根据容器id进入tomcat容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker exec -it 645596565d3f /bin/bash
root@645596565d3f:/usr/local/tomcat#
#查看tomcat容器内部内容:
root@645596565d3f:/usr/local/tomcat# ls -l
total 152
-rw-r--r-- 1 root root 18982 May 5 20:40 BUILDING.txt
-rw-r--r-- 1 root root 5409 May 5 20:40 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 May 5 20:40 LICENSE
-rw-r--r-- 1 root root 2333 May 5 20:40 NOTICE
-rw-r--r-- 1 root root 3255 May 5 20:40 README.md
-rw-r--r-- 1 root root 6898 May 5 20:40 RELEASE-NOTES
-rw-r--r-- 1 root root 16262 May 5 20:40 RUNNING.txt
drwxr-xr-x 2 root root 4096 May 16 12:05 bin
drwxr-xr-x 1 root root 4096 May 21 11:04 conf
drwxr-xr-x 2 root root 4096 May 16 12:05 lib
drwxrwxrwx 1 root root 4096 May 21 11:04 logs
drwxr-xr-x 2 root root 4096 May 16 12:05 native-jni-lib
drwxrwxrwx 2 root root 4096 May 16 12:05 temp
drwxr-xr-x 2 root root 4096 May 16 12:05 webapps
drwxr-xr-x 7 root root 4096 May 5 20:37 webapps.dist
drwxrwxrwx 2 root root 4096 May 5 20:36 work
root@645596565d3f:/usr/local/tomcat#
#进入webapps目录
root@645596565d3f:/usr/local/tomcat# cd webapps
root@645596565d3f:/usr/local/tomcat/webapps# ls
root@645596565d3f:/usr/local/tomcat/webapps#
# 发现问题:1、linux命令少了。 2.webapps目录为空
# 原因:阿里云镜像的原因,阿里云默认是最小的镜像,所以不必要的都剔除掉
# 保证最小可运行的环境!
# 解决方案:
# 将webapps.dist下的文件都拷贝到webapps下即可
root@645596565d3f:/usr/local/tomcat# ls 找到webapps.dist
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@645596565d3f:/usr/local/tomcat# cd webapps.dist/ # 进入webapps.dist
root@645596565d3f:/usr/local/tomcat/webapps.dist# ls # 查看内容
ROOT docs examples host-manager manager
root@645596565d3f:/usr/local/tomcat/webapps.dist# cd ..
root@645596565d3f:/usr/local/tomcat# cp -r webapps.dist/* webapps # 拷贝webapps.dist 内容给webapps
root@645596565d3f:/usr/local/tomcat# cd webapps #进入webapps
root@645596565d3f:/usr/local/tomcat/webapps# ls #查看拷贝结果
ROOT docs examples host-manager manager