记初学Docker

认识Docker

Docker定义

Docker 是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制( 沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响 ),相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。
镜像就类似于在创建虚拟机前需要下载的系统镜像文件,比如iso文件、img文件等一些镜像文件。
容器可以类比于正在运行中的虚拟机。

Docker优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

Docker配置

安装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://download.docker.com/linux/centos/docker-ce.repo
#默认是从国外的,不推荐
#推荐使用国内的
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
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world

卸载docker

#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!

配置阿里云镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://92hysgko.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker基础命令

启动docker systemctl start docker

关闭docker systemctl stop docker

重启docker systemctl restart docker

查看docker版本信息 docker version docker info

docker镜像命令

查看自己服务器中docker 镜像列表

docker images
-a 列出本地所有的镜像
-f 显示满足条件的镜像
-q 只显示镜像ID

搜索镜像

docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像

拉取镜像

docker pull 镜像名 
docker pull 镜像名:tag

运行镜像

docker run 镜像名
docker run 镜像名:Tag

删除镜像 ------当前镜像没有被任何容器使用才可以删除

#删除一个
docker rmi -f 镜像ID
#删除多个 
docker rmi -f 镜像ID 镜像ID 镜像ID
#删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)

commit镜像

docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]

docker容器命令

新建容器并启动

docker run [可选参数] image
# 参数说明
--name = "Name" 容器名字 tomcat01	tomcat02,用来区分容器
-d				后台方式运行
-it				使用交互方式运行,进入容器查看内容
-p				指定容器的端口 -p 8080:8080
	-p	ip:主机端口:容器端口
	-p	主机端口:容器端口
	-p	容器端口
	容器端口
-p				随即指定端口

查看容器

docker ps [参数]
# 参数说明
		# 列出当前正在运行的容器
-a		# 列出当前 + 历史运行过的容器
-n = ?	# 列出最近n个创建的容器
-q		# 只显示容器编号

退出容器

exit			# 容器停止并退出
ctrl + p + q	# 容器不停止退出

删除容器

docker rm 容器id				# 删除指定容器,-f强制删除
docker rm $(docker ps -aq)	 # 删除所有容器

启动和停止容器

docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id	# 强制停止

查看日志

docker logs [参数] 容器id
# 参数说明
-f		# 跟踪日志输出
--since	# 显示某个开始时间的所有日志
-t		# 显示时间戳
--tail  # 列出最新n条容器日志
docker logs -f -t
docker logs -f -t --tail 条数 容器id

查看容器中进程信息ps

docker top 容器id

查看镜像的元数据

docker inspect 容器id

进入当前正在运行容器

docker exec -it 容器id /bin/bash	# 进入容器后开启一个新的终端,可以在里面操作
docker attach 容器id				# 进入容器正在执行的终端,不会启动新的进程

拷贝容器文件到主机上

docker cp 容器id:容器内路径 目的主机路径

容器数据卷

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

容器的持久化和同步操作,容器间的数据共享

挂载

# 匿名挂载 (只写了容器内的路径,生成随机卷名)
docker run -d  -v 容器内目录

# 查看所有的volume的情况
docker volume ls

# 具名挂载
docker run -d  -v 卷名:容器内目录  镜像名/id 

# 指定路径挂载 docker volume ls 是查看不到的
-v /宿主机路径:容器内路径 

# 未指定主机内目录时使用默认路径
/var/lib/docker/volumes/卷名/_data

容器挂载权限

# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

Dockerfile

常用指令

# DockerFile常用指令
FROM		# 基础镜像,一切从这里开始构建
MAINTAINER 	# 镜像是谁写的, 姓名+邮箱
RUN 		# 镜像构建的时候需要运行的命令
ADD 		# 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR 	# 镜像的工作目录
VOLUME 		# 挂载的目录
EXPOSE 		# 保留端口配置
CMD 		# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT 	# 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 	# 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指
令。
COPY 		# 类似ADD,将我们文件拷贝到镜像中
ENV 		# 构建的时候设置环境变量!

CMD 和 ENTRYPOINT区别

1.如果在dockerfile里出现多个CMD,只有最后一个CMD会生效
2.docker run + command会覆盖cmd参数
3.CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖

tomcat示例

FROM centos #
MAINTAINER pan3535<2905858092@qq.com>
COPY README /usr/local/README #复制文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压
RUN yum -y install vim
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:
EXPOSE 8080 #设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apachetomcat-9.0.35/logs/catalina.out # 设置默认命令

build镜像、更改镜像名称、push镜像

一般命令为账号+名称+版本号 pan3535/xxx:v1.0
# 通过Dockerfile文件build镜像
docker build -f 文件路径 -t 镜像名 .  # 文件名为Dockerfile时可省略且最后的.不要忽略
# 更改镜像名称 
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 登录hub
docker login -u pan3535
docker logout
# push镜像
docker push 镜像名称 # 默认dockerhub,命名需要规范

push到阿里云镜像仓库

请添加图片描述

Docker网络命令

–link(不建议使用)

本质就是在hosts配置中添加映射
自定义网络,不适用docker0
docker0问题:不支持容器名连接访问

docker run -d -P --link 容器名A/id 容器名B/id 镜像名/id
示例:docker run -d -P --name tomcat03 --link tomcat02 tomcat
tomcat03可以ping通tomcat02,反之不行
通过docker network inspect 容器id  查看信息可知本质是hosts映射

自定义网络

docker network
connect 	-- 连接一个容器到网络
create		-- 创建网络
disconnect 	-- 断开一个容器与网络之间的连接
inspect 	-- 查看一个网络信息
ls 			-- 查看所有网络
prune 		-- 移除所有未使用网络
rm 			-- 删除一个或多个网络

网络模式
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和所主机共享网络
container :容器网络连通(用得少!局限很大)

	# 创建网络
	docker  network create --driver 网络模式 --subnet 子网ip --gateway 网关 网络名     
	示例:docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
	
	# 不同网络之间容器无法通过容器名访问
	docker network connect 网络名 容器名/id 

redis集群示例

# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个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

# 通过脚本运行六个redis
for port in $(seq 1 6);\
docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server
/etc/redis/redis.conf
docker exec -it redis-1 /bin/sh #redis默认没有bash
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 1

SpringBoot打包Docker镜像

1.打包成jar
mvn package
2.编写Dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

3.构建镜像

# 1.复制jar和Dockerfile到服务器
# 2.构建镜像
docker build -t xxxxx:xx .

4.发布运行

以后我们使用了Docker之后,给别人交付就是一个镜像即可!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值