一款产品:开发...测试..上线,三套环境!
例如:发布一个项目(jar+redis mysql jdk等),项目能不能带上环境安装一起打包
传统:java -- apk(应用)-- 发布(应用商店)--张三使用apk -- 下载安装即可使用
现在:java -- jar(环境)-- 打包项目带上环境(镜像)-- (docker仓库:商店) --下载我们发布的镜像 -- 直接运行即可!
Docker的核心思想:隔离
2010年,几个搞it的年轻人,就在美国成立了一家公司叫dotCloud
做一些pass的云计算服务,LXC有关的容器服务!
他们将自己的技术(容器化技术)命名为docker!
Docker刚刚诞生的时候,没有引起行业的注意!dotCloud,就活不下去了!
想到了“开源”
开放源代码!
2013年,docker开源!
Docker越来越多的人发现了docker的优点!火了,docker每个月都会有新的版本诞生!
2014年4月9日,docker1.0发布!
Docker至今短短10年为什么这么火?
十分轻巧
在容器技术出来之前,我们都是使用虚拟机(非常占内存及本地资源),vm、kvm等!
镜像(image):就好比是个一个模板,可以通过这个模板来启动容器创建容器服务,tomcat镜像 --- run --- tomcat服务,可以经过这个镜像可以启动无数个(最终服务运行或项目运行就是在这个容器中的)
容器(container):docker利用容器技术,独立运行一个或一组应用,通过镜像来创建的;容器的基本命令,启动、停止、删除!目前就可以把这个容器理解为就是一个简易的Linux系统。
仓库(repository):仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库。公有仓库有docker Hub(默认是国外的)、阿里云、腾讯云...都有容器服务器(我们需要配置镜像加速)
环境准备:系统centos7
帮助文档:
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine |
yum install -y yum-utils |
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 makecache fast |
yum -y install docker-ce docker-ce-cli containerd.io 注:docker-ce 社区、docker-ee 企业版 |
systemctl start docker |
8、测试hello-world
docker run hello-world
9查看一下hello-world镜像在不在?
docker images |
10如何卸载docker
yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker #docker默认的工作路径 rm -rf /var/lib/containerd |
1、登录阿里云平台找到“产品与服务”里的“容器镜像服务”
Docker是一个client-server结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问!
Docker-server接受到docker-client的指令就会执行这个命令!
Docker利用的是宿主机的内核,vm需要Guest OS
所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免一些引导性的操作。
Docker version #显示docker的版本信息 Docker info #显示docker的系统信息,docker的镜像和容器信息 Docker 命令 --help #万能命令 |
Docker images 查看所有本地的主机上的镜像
[root@localhost containerd]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB #解释: REPOSITORY #镜像的仓库源 TAG #镜像的标签 IMAGE ID #镜像的ID CREATED #镜像的创建时间 SIZE #镜像的大小 #可选项 [root@localhost containerd]# docker images --help Usage: docker images [OPTIONS] [REPOSITORY[:TAG]] List images Options: -a, --all #显示所有镜像 -q, --quiet #只显示镜像的ID |
Docker search 镜像名称 #搜索镜像
[root@localhost containerd]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11082 [OK] mariadb MariaDB Server is a high performing open sou… 4199 [OK] #可选项,通过搜索来过滤 --filter=STARS=4000 #就是搜索出来的镜像STARS大于4000的。 |
Docker pull 镜像名称[:tag] #下载镜像
最新版本下载: [root@localhost containerd]# docker pull mysql Using default tag: latest #不跟版本,下载默认最新的版本 latest: Pulling from library/mysql b4d181a07f80: Pull complete #分层下载,image的核心,联合文件系统 a462b60610f5: Pull complete 578fafb77ab8: Pull complete 524046006037: Pull complete d0cbe54c8855: Pull complete aa18e05cc46d: Pull complete 32ca814c833f: Pull complete 9ecc8abdb7f5: Pull complete ad042b682e0f: Pull complete 71d327c6bb78: Pull complete 165d1d10a3fa: Pull complete 2f40c47d0626: Pull complete Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b #签名信息,防伪标识 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址 指定版本下载: [root@localhost containerd]# docker pull mysql:5.7 5.7: Pulling from library/mysql b4d181a07f80: Already exists a462b60610f5: Already exists 578fafb77ab8: Already exists 524046006037: Already exists d0cbe54c8855: Already exists aa18e05cc46d: Already exists 32ca814c833f: Already exists 52645b4af634: Pull complete bca6a5b14385: Pull complete 309f36297c75: Pull complete 7d75cacde0f8: Pull complete Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 |
Docker rmi 删除镜像
docker rmi -f 09361feeb475 #根据镜像ID,删除单个镜像 docker rmi -f $(docker images -aq) #删除全部镜像 |
说明:我们有了镜像才可以创建容器,下载一个centos镜像来测试学习!
docker pull centos |
创建容器并启动
docker run [可选参数] image 参数说明: --name=“name” #容器的名字 tomcat01 tomcat02 用来区分容器 -d #后台方式运行 -it #使用交互方式运行,进入容器查看内容 /bin/bash #给一个控制台 -p #指定容器的端口 -p8080:8080 -p ip:主机端口:容器端口 -p主机端口:容器端口 (常用) -p容器端口 -P #随机映射一个 49000~49900 的端口到内部容器开放的网络端口 -v 宿主机目录和容器内目录映射 测试 启动并进入容器: [root@localhost containerd]# docker run -it centos /bin/bash [root@c2e9f2af5df6 /]# ls #查看容器内的centos ,基础版本,很多命令是不完善的 bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@c2e9f2af5df6 /]# exit #退出命令 exit [root@localhost /]# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var |
列出容器:
dokcer ps #查看正在运行中的容器列表 -a #查看所有容器 -n=? #显示最近创建的容器 -q #只显示容器的ID [root@localhost /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2e9f2af5df6 centos "/bin/bash" 7 minutes ago Exited (0) 4 minutes ago infallible_wu 04e4b20d023d d1165f221234 "/hello" 2 hours ago Exited (0) 2 hours ago flamboyant_hellman |
退出容器
Exit #退出后容器停止 Ctrl+p+q #退出容器不停止 |
删除容器
docker rm 容器id #删除指定容器,不能删除正在运行中的容器 docker rm -f $(docker ps -aq) #删除所有的容器 docker ps -a -q | xargs docker rm #删除所有的容器 |
启动和停止容器的操作
docker start 容器id #启动容器 docker stop容器id #停止当前运行容器 docker restart 容器id #重启容器 docker kill 容器id #强制停止当前容器 |
docker logs -f -t --tail 10 容器 -tf #显示日志 --tail number #要显示日志条数 [root@MiWiFi-R4A-srv ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2e9f2af5df6 centos "/bin/bash" 10 hours ago Up 6 seconds infallible_wu [root@MiWiFi-R4A-srv ~]# docker logs -f -t --tail 10 c2e9f2af5df6 2021-07-03T16:58:57.371780294Z [root@c2e9f2af5df6 /]# ls 2021-07-03T16:58:57.378009686Z bin etc lib lost+found mnt proc run srv tmp var 2021-07-03T16:58:57.378060051Z dev home lib64 media opt root sbin sys usr 2021-07-03T17:00:45.937116561Z [root@c2e9f2af5df6 /]# exit 2021-07-03T17:00:45.937156697Z exit |
[root@MiWiFi-R4A-srv ~]# docker top c2e9f2af5df6 UID PID PPID C STIME TTY TIME CMD root 9559 9538 0 11:00 pts/0 00:00:00 /bin/bash [root@MiWiFi-R4A-srv ~]# docker inspect --help Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...] Return low-level information on Docker objects Options: -f, --format string Format the output using the given Go template -s, --size Display total file sizes if the type is container --type string Return JSON for specified type [root@MiWiFi-R4A-srv ~]# docker inspect c2e9f2af5df6 |
#我们通常容器都是使用后台方式运行,退出容器后需要再次进入容器修改一些配置
#命令 方式一:docker exec -it 容器id bashshell #进入容器后开启一个新的终端,可以在里面操作(常用) [root@MiWiFi-R4A-srv ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2e9f2af5df6 centos "/bin/bash" 10 hours ago Up 14 minutes infallible_wu [root@MiWiFi-R4A-srv ~]# docker exec -it c2e9f2af5df6 /bin/bash [root@c2e9f2af5df6 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr 方式二: docker attach 容器id #进入容器正在执行的终端,不会启动新的进程 [root@MiWiFi-R4A-srv ~]# docker attach c2e9f2af5df6 [root@c2e9f2af5df6 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@c2e9f2af5df6 /]# |
docker cp c2e9f2af5df6:容器文件路径 本地路径 #进入docker容器内部 [root@MiWiFi-R4A-srv ~]# docker attach c2e9f2af5df6 [root@c2e9f2af5df6 /]# ls bin etc lib lost+found mnt proc run srv tianda.txt usr dev home lib64 media opt root sbin sys tmp var [root@c2e9f2af5df6 /]# pwd / #cp容器内部文件到本地 [root@MiWiFi-R4A-srv ~]# docker cp c2e9f2af5df6:/tianda.txt ./ [root@MiWiFi-R4A-srv ~]# ls ?? initial-setup-ks.cfg tianda.txt 模板 图片 下载 桌面 anaconda-ks.cfg localho 注:cp是一个手动过程,后边我们使用-v选项,以卷的技术实现自动 |
docker cp host_path containerID:container_path
#docker cp 本地文件 容器id:容器路径
1. 如何搜索镜像和获取镜像? dockersearch 关键字和 docker pull 镜像名 2、创建一个保持运行的容器命令? docker run -t -i centos /bin/bash 3、容器的启动、停止及重启命令? docker start 、restart 、stop 容器id 4、怎么查看正在运行的容器和所有容器? docker ps && docker ps -a 5、怎么退出容器:两种方法分别? exit:bash终止,容器进入停止状态 ctrl+p && Ctrl+q:退出容器,但容器保持运行状态 6、查看容器运行信息(占用的cpu、内存、网络等) docker stats 容器id 7、怎么查看在容器里做过的操作记录? docker diff 容器id 8、怎么连接到运行的容器? docker attach 容器id docker exec -ti 容器id /bin/bash 9、查看容器或镜像的内部信息? docker inspect 容器id或镜像id 10、如何删除容器? docker rm 容器id (前提需要关闭运行的容器),不关闭加-f强行移除 11、如何查看所有镜像? docker images 12、如何删除镜像? 在没有容器使用此镜像的前提下使用: docker rmi 镜像id 13、从容器内拷贝文件到主机上 docker cp c2e9f2af5df6:容器文件路径 本地路径 |
作业一:
Docker安装nginx 1、搜索镜像 search 镜像名称 #建议大家去docker搜索,可以看帮助文档 2、拉去镜像 pull 镜像名称 3、docker images 查看镜像 4、docker run -d --name nginx01 -p 3344:80 nginx 5、运行测试 :elinks http://ip:3344 --dump 6、进入容器查看配置文件 docker exec -it nginx01 /bin/bash whereis nginx cd /etc/nginx ls |
端口暴露的概念:
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在外部提供一个映射路径,达到在容器外修改文件名,容器内部就可以自动修改?(使用-v数据卷技术实现)
作业二:
使用docker安装一个tomcat!
#官方的使用 Docker run -it --rm tomcat:9.0 #我们之前的启动都是后台启动,停止了容器之后,容器还是可以查到的,Docker run -it --rm 一般是用来测试的,用完即删。 #下载启动 docker pull tomcat #启动tomcat docker run -d -p 3355:8080 --name tomcat01 tomcat 安装好tomcat后,默认没有webapps,阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除了,保证最小的可用的环境。 将/usr/local/tomcat/下webapps.dist目录里的文件cp到webapps下即可。 思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?咱们要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了! |
docker的总结就到这里!如果可以的话给个赞吧!