docker的学习之路


常用命令

一.docker 安装

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://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
	yum makecache fast
#4安装docker相关 ce社区版 ee企业版
	yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#5启动docker
	systemctl start docker
#6查看是否安装成功
	docker version
#7hello world
	docker run hello-world
		①提示docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
		See 'docker run --help'.
		②解决方法:在/etc/docker/下创建daemon.json
		里面加入内容
			{
				"registry-mirrors": ["https://docker.registry.cyou",
				"https://docker-cf.registry.cyou",
				"https://dockercf.jsdelivr.fyi",
				"https://docker.jsdelivr.fyi",
				"https://dockertest.jsdelivr.fyi",
				"https://mirror.aliyuncs.com",
				"https://dockerproxy.com",
				"https://mirror.baidubce.com",
				"https://docker.m.daocloud.io",
				"https://docker.nju.edu.cn",
				"https://docker.mirrors.sjtug.sjtu.edu.cn",
				"https://docker.mirrors.ustc.edu.cn",
				"https://mirror.iscas.ac.cn",
				"https://docker.rainbond.cc",
				"https://docker.m.daocloud.io",
				"https://registry.docker-cn.com",
				"https://hub-mirror.c.163.com",
				"https://hub.uuuadc.top",
				"https://docker.anyhub.us.kg",
				"https://dockerhub.jobcher.com",
				"https://dockerhub.icu",
				"https://docker.ckyl.me",
				"https://docker.awsl9527.cn",
				"https://mirror.ccs.tencentyun.com"]
			}
		③重启docker
		systemctl daemon-reload
		systemctl restart docker
		④可能慢点,等一会就会发现,成了.
#8查看镜像是否存在
	docker images
#9卸载docker
	①卸载依赖
		yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
	②删除资源
		rm -rf /var/lib/docker
		rm -rf /var/lib/containerd
	③/var/lib/docker 是docker的默认工作路径

二.docker执行顺序

开始->本地查看是否有目标镜像->有直接用,没有去DockerHub下载->DockerHub有下载到本地,无报错.

三.docker命令

docker version #显示docker的版本信息
docker info    #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help  #帮助命令
帮助文档地址:https://docs.docker.com/reference/
1.镜像命令
	docker images 
	docker search mysql #搜索
	docker pull #拉取镜像
	docker rmi #删除镜像 docker rmi -f 镜像id
	docker rmi -f $(docker images -aq) #删所有镜像
		ps:删除镜像后,容器不会自动删除,还会占用内存,需要手动将容器删除
2.容器命令(有了镜像才能创建容器)
	docker run image
		--name="name" 容器名字
		-d 后台方式运行
			常见的坑:docker容器使用后台运行,必须要有一个前台进程,若没有自动停止
		-it 使用交互方式运行,进入容器查看内容
		docker run -it centos /bin/bash #启动并进入容器
		-p 指定容器的端口 
			-p ip:主机端口:容器端口
			-p 主机端口:容器端口(常用)
			-p 容器端口
			-P 随机指定端口
	docker ps 命令
		-a #列出正在运行的容器+历史运行过的容器
		-n=? #显示最近创建的容器
		-q #只显示容器的编号
	退出容器
		exit #直接容器停止并退出
		ctrl + p + q #(快捷键)容器不停止退出
	删除容器
		docker rm 容器id
	启动和停止容器操作
		docker start 容器id #启动容器
		docker restart 容器id #重启容器
		docker stop 容器id #停止当前正在运行的容器
		docker kill 容器id #强制停止当前容器
	查看日志
		docker logs -tf --tail 10 容器id
		-t日志加时间 -f保留打印窗口
	查看容器中进程信息
		docker top 容器id
	进入当前正在运行的容器
		docker exec -it 容器id /bin/bash #进入容器后开启一个新的终端
		docker attach 容器id#进入容器正在执行的终端,不会启动新的进程
	从容器拷贝文件到主机上
		docker cp 容器id:容器内路径 目的地主机路径
		docker cp 1d2184bf9e40:/home/test.java /home

四.安装nginx

docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx
测试 curl localhost:3344

五.安装tomcat

docker pull tomcat:9.0
docker run -d -p 3344:8080 --name tomcat01 tomcat:9.0 #最后不指定版本号,默认启动最新版本
发现问题:1.linux命令少了2.webapps内没有内容
解决问题:可以将webapps.dist 中的内容复制到webapps文件中 
	cp -r webapps.dist/* webapps

六.部署es+kibana

#es暴露的端口最多
#es十分耗内存
#es的数据一般需要放置到安全目录
#--net somenetwork ? 网络配置
#启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2			

七.commit镜像(等于保存快照)

docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像:[TAG]

八.容器数据卷(卷技术,将容器内的目录,挂载到linux上面)

1.需求:若mysql在某个容器内,删了容器,数据也就丢了.如何删了容器,数据不丢.
2.使用数据卷
	方式一:直接使用命令来挂载 -v
	docker run -it -v 主机目录:容器内目录
	docker run -it -v /home/ceshi:/home centos /bin/bash
3.具名和匿名挂载
	#匿名挂载:在-v 只写了容器内的路径,没有写容器外的路径
	docker run -d -p --name nginx01 -v /etc/nginx nginx
	#具名挂载:
	docker run -d -p --name nginx02 -v test-nginx:/etc/nginx nginx
	#查看 docker column ls
	#没有指定目录的情况下,卷都放在/var/lib/docker/volumes/xx
	#如何确定具名挂载还是匿名挂载
		-v 容器内路径 #匿名挂载
		-v 卷名:容器内路径 #具名挂载
		-v /宿主机路径:容器内路径 #指定路径挂载
4.拓展
	#通过-v 容器内路径 ro rw 改变读写权限
	ro readonly #只读
	rw readwrite #只读可写
	#ro 只要看到ro说明只能通过宿主机来操作,容器内部无法操作!
	
5.mysql卷测试
	docker pull mysql
	#-d后台启动 -p端口映射 -v挂载 -e环境配置 --name容器名字
	docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

九.数据卷容器

多个容器之间实现同步数据
docker run -it --name docker02 --volumes-from docker01 centos
多个mysql实现共享
docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql
结论:容器的生命周期一直持续到没有容器使用为止,但是持久到了本地,本地数据不会删除.

十.DockerFile

1.构建docker镜像步骤:
	①.编写一个dockerfile文件
	②.docker build构建成一个镜像
	③.docker run运行镜像
	④.docker push发布镜像(DockerHub.阿里云镜像仓库)
2.基础知识
	①每个保留关键字(指令)都是必须是大写字母
	②执行从上到下顺序执行
	③#表示注释
	④每一行指令都会创建提交一个新的镜像层,并提交
3.开发,部署,运维
	DocekerFile:构建文件,定义了一切的步骤,源代码
	DockerImages:通过DockerFile构建生成镜像,最终发布和运行的产品
	Docker容器:容器是镜像运行起来提供服务的
4.基本命令
	FROM         #基础镜像,一切从这里开始构建
	MAINTAINER   #镜像是谁写的,姓名+邮箱
	RUN          #镜像构建的时候需要运行的命令
	ADD          #添加其他镜像,比如添加tomcat镜像,需要添加tomcat压缩包
	WORKDIR      #进项的工作目录
	VOLUME       #挂载的目录
	EXPOSE       #暴露端口配置
	CMD          #指定这个容器启动的时候要运行的命令,只有最后一个生效,可被替代
	ENTRYPOINT   #指定这个容器启动的时候要运行的命令,可以追加命令
	ONBUILD      #当构建一个被继承 DockerFile的容器时就会运行ONBUILD的指令,是个触发指令
	COPY         #类似ADD,将我们文件拷贝到镜像中
	ENV          #构建的时候配置环境变量
5.编写centos
	①编写dockerfile文件
		FROM centos
		MAINTAINER people<12345@qq.com>
		ENV MYPATH /usr/local
		WORKDIR $MYPATH
		RUN yum -y install vim
		RUN yum -y install net-tools
		EXPOSE 80
		CMD echo $MYPATH
		CMD echo "----end----"
		CMD /bin/bash
	②查看dockerfile文件
		cat 文件名
	③构建dockerfile文件镜像(最后那个点不能掉)
		docker build -f dockerfile文件路径 -t 镜像名:[tag] .
		docker build -f mydockerfile -t mycentos:0.1 .
	④启动镜像
		docker run -it mycentos:0.1
	⑤查看镜像历史
		docker history 镜像id
6.编写tomcat
	①编写dockerfile
		FROM centos
		MAINTAINER people<12345@qq.com>
		COPY readme.txt /usr/local/readme.txt
		ADD jdk-8ull-linux-x64.tar.gz /usr/local
		ADD apache-tomcat-9.0.22.tar.gz /usr/local
		RUN yum -y install vim 
		ENV MYPATH /usr/local
		WORK $MYPATH
		ENV JAVA_HOME /usr/local/jdk1.8.0_11
		ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
		ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
		ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
		ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
		EXPOSE 8080
		CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
	②构建镜像
		docker build -t diytomcat .
	③启动镜像
		docker run -d -p 3344:8080 --name testtomcat -v /home/mytomcat/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/mytomcat/build/tomcat/tomcatlogs/:usr/local/apache-tomcat-9.0.22/logs diytomcat
7.发布镜像
	1.发布到DockerHub
		①DockerHub注册账号
		②登录
			docker login -u name
		③提交
			docker push username/myapp:v1.0
		④提交不成功
			构建镜像的时候,命名需要username打头
			docker tag 镜像id username/diytomcat:1.0
			重新提交
	2.发布到阿里云

十一.Docker网络

ps:容器之间可以通过ip进行ping通,无法通过容器名字ping通,若是在自定义的网络中启动容器,则两个容器可以通过名字ping通
	1.自定义网络
		docker network ls #查看docker网络
		网络模式
			bridge:桥接docker(默认,自己创建也是用该模式)
			none:不配置网络
			host:和宿主机共享网络
			container:容器网络连通 (局限大,用的少)
	2.测试
		①配置自己的网络
			# --driver bridge
			# --subnet 192.168.0.0/16
			# --gateway 192.168.0.1
			docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
		②查看自己的网络
			docker network inspect mynet
		③在自己网络中启动容器
			docker run -d -P --name tomcat-net-01 --net mynet tomcat
			docker run -d -P --name tomcat-net-02 --net mynet tomcat
		④测试ping连接
			docker exec -it tomcat-net-01 ping tomcat-net-02
	3.好处
		不同的集群使用不同的网络,保证集群的安全
	4.网络连通(两个独立的网络连通)
		docker network connect mynet tomcat01
		docker network inspect mynet

十二.搭建redis集群

docker network create redis --subnet 172.38.0.0/16
docker network ls
docker network inspect redis
1. 通过脚本创建六个redis配置
	for port in $(seq 1 6); \
	do \
	mkdir -p /mydata/redis/node-${port}/conf
	touch /mydata/redis/node-${port}/conf/redis.conf
	cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
	port 6379
	bind 0.0.0.0
	cluster-enabled yes
	cluster-config-file nodes.conf
	cluster-node-timeout 5000
	cluster-announce-ip 172.38.0.1${port}
	cluster-announce-port 6379
	cluster-announce-bus-port 16379
	appendonly yes
	EOF
	done
2.在自己网络内启动redis (启动6个,改端口,名字,ip)
	docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
	-v /mydata/redis/node-1/data:/data \
	-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
	-d --net redis --ip 172.38.0.11 redis redis-server /etc/redis/redis.conf
3.进入任何一个redis内,搭建集群
	docker exec -it redis-1 /bin/sh
	redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas l
	#查看是否成功
		redis-cli -c
		cluster nodes 
		set a b 将处理该操作的容器停掉,然后执行get a,若获取到b,说明集群搭建成功.

十三.SpringBoot微服务打包Docker镜像

1.构建SpringBoot项目
	①file->new project->Spring Initializr->type选择maven,SpringBoot版本可能不让选择2.x,可以忽略,后面直接改pom文件->一路next,完成
	②修改pom.xml
		<parent>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-parent</artifactId>
			<version>2.3.5.RELEASE</version>
			<relativePath/> <!-- lookup parent from repository -->
		</parent>
		<properties>
			<java.version>1.8</java.version>
		</properties>
2.打包应用
	pakage
3.安装docker插件
4.编写dockerfile ps:jdk8下不动就换成from openjdk:8
	FROM java:8
	COPY *.jar /app.jar
	CMD ["--server.port=8080"]
	EXPOSE 8080
	ENTRYPOINT ["java","-jar","/app.jar"]
5.构建镜像
	①将jar包和Dokerfile上传至服务器
	②docker build -t testimage .
	③docker run -d -P --name springboot-web testimage
	④curl localhost:外部端口/接口测试
6.发布运行
	①导出docker镜像
		#myimage:tag 是你要导出的镜像名称和标签。
		#myimage.tar 是你希望保存的文件名。
		docker save -o myimage.tar myimage:tag
		#压缩 tar 文件
		gzip myimage.tar
	②导入docker镜像
		gunzip myimage.tar.gz
		docker load -i myimage.tar	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值