Docker学习笔记——小白版

对docker的理解

Docker是一个小的虚拟机,在这里面我们可以搭建自己的生产环境,装入我们平时需要的数据库,程序的运行环境以及其他的。
总之我们可以把我们部署在生产环境的所有软件都预先部署在docker里面,然后生成镜像(类似于我们的压缩包或者windows系统的镜像),这样我们就屏蔽了不通服务器以及操作系统版本的差异,只要能顺利装上docker,我们的其他服务也没问题,我们只需要把之前的镜像导入进去新的docker里面即可。
还有一个优势是同一个服务在端口等条件不冲突的情况下,可以发布多个服务。比如我们可以在一台机器上运行多个端口号不通的tomcat。

docker操作

docker安装

#  查看你当前的内核版本(必须大于3.10)
 uname -r 	
 
# 下载docker
 yum -y install docker	
# 查看docker版本
docker version 	
# docker 启动(方式一)
service docker start	
# docker 启动(方式二)
systemctl start docker.service	docker 
#运行测试项目
docker run hello-world 
#(如果报错:运行命令:vi  /etc/sysconfig/docker 在其中添加这一条命令:
# --registry-mirror=http://f2d6cb40.m.daocloud.io

# 重启docker
service docker restart

出现错误时的配置,注意新加镜像配置的位置( --registry-mirror=http://f2d6cb40.m.daocloud.io )

docker下载镜像

# 从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 	

# eg: 可以直接使用docker pull centos:7命令安装镜像
docker pull centos:7	

# 列出所有当前已安装镜像
docker images
	

docker运行镜像

#根据镜像启动容器:
docker run --name 自定义名字 -d  镜像名字:tags
#-d:后台运行
#eg:这是第一次运行容器程序(根据镜像启动容器),启动tomcat
docker run --name tomcatdocker -d tomcat:latest


# 普通启动(根据容易中的名字):
docker start CONTAINER ID(或者容器的自定义名字)


#端口映射启动:
docker run -d -p:外部映射端口:容器内部端口 镜像id

启动mysql

#运行mysql
docker run --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7

–name 容器名称
-e MYSQL_ROOT_PASSWORD 设置初始密码
-p 3307:3306 端口映射,主机端口3307

启动nginx

运行 nginx 容器:
$ docker run --name nginx-test -p 8080:80 -d nginx

参数说明:
–name nginx-test 容器名称。
-p 8080:80 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
-d 设置容器在在后台一直运行。

Docker部署SpringBoot

把该文件(Dockerfile)和SpringBoot的jar放在同一个目录下面,进入到该目录下后,并执行下面的命令就可以生成镜像了:

docker build -t wdfimagetest .

ps:千万不要落了上面那行后面的那个点

Dockerfile的操作:
编写Dockerfile文件,创建文件名为Dockerfile的文本文件,内容如下:


# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER WDF <1528401054@qq.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD SpringBoot-WDF-0.2.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
EXPOSE 80
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar", "--server.port=80", "> /log/app.log"]

参数解释:
java:8是指jdk1.8
VOLUME指向了一个/tmp的目录,Tomcat默认使用/tmp作为工作目录。效果就是在主机	的/var/lib/docker目录下创建了一个临时文件,并连接到容器的/tmp。
将项目的jar文件作为app.jar添加到容器
RUN表示在新创建的镜像中执行一些命令,然后把执行的结果提交到当前镜像。
EXPOSE 容器暴露端口
ENTRYPOINT 应用启动命令 参数设定

复制文件到docker中的容器

方法一:

docker  cp   需要放入的文件  容器ID :/ 要复制过去的目录路径

(eg:目标路径如果tomcat,应该在这个路径下为tomcat的根目录:/usr/local/tomcat)

方法二:

挂载的意思就是在宿主机上的某个目录被映射到docker某个容器里。
其实就是写容器外的目录,写入容器内的可写层,就是方便开发。

可先在宿主机上创建一个专门存放docker映射的目录(这里是里是以挂载tomcat为例:先弄个home目录,存放tomcat映射的目录叫mytomcat

# 创建目录
mkdir /home/mytomcat
#移动到该目录
cd /home/mytomcat
#映射命令
docker run -d -p 8080:8080 --name tomcat -v /home/mytomcat:/usr/local/tomcat/webapps --restart=always tomcat

-v 表示基于容器的centos系统的/home/mytomcat目录与本地/usr/local/tomcat/webapps共享;这可以很方便将本地文件上传到Docker内部的系统。
注意:前提是容器没有运行,如果已运行,则删掉。

上传镜像到仓库

https://hub.docker.com/ 上面注册一个账户,并新建一个仓库。(免费的哦)

第一步:定义本地的tag名字用于推送指定的仓库(使用 docker tag 命令,为镜像添加一个新的标签。)

docker tag 本地的仓库名字docker的登录id/docker的仓库名字:要修改后的tag名字
#Eg:
docker tag wdfimagetest 17865316777/wdf_docker:wdfimage1

第二步:推送到仓库

docker push docker的登录id/docker的仓库名字:本地的tag名字
#Eg:
docker push 17865316777/wdf_docker:wdfimage1

命令总结

镜像相关

下载镜像:

docker pull 名字:tags (tags:版本号)

具体版本号码可以在上面的官网,输入软件的名字,查到后,点击软件进行查找,再点击tags标签即可选择相应的版本,默认的版本latest为最新版本。tags也可选择最新的版本。

查看镜像

docker images

• REPOSITORY:表示镜像的仓库源
• TAG:镜像的标签
• IMAGE ID:镜像ID
• CREATED:镜像创建时间
• SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

显示一个镜像的历史

docker history image-name

查看镜像的配置信息:

docker inspect my-nginx

删除镜像

docker rmi 镜像id
#eg: 
docker rmi 62a9f311b99c

通过上面的命令查出来的镜像id

容器相关

关闭容器

docker stop 自定义容器名字(或者:CONTAINER ID运行程序的id)

删除容器

docker rm 自定义名字(或者:CONTAINER ID)
#eg:
docker rm tomcatdocker

查看容器日志

docker logs 容器id(或者:容器名字)

列出当前正在运行的容器

docker container ls

查看所有容器,包括关闭的

docker ps -a

进入容器的目录

docker进入运行的镜像目录(比如tomcat的根目录):

docker exec -it 镜像id /bin/bash

-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因 此我们需要交互式终端。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。

遇到的错误

一个镜像指向了两个tag时删不掉:

Error response from daemon: conflict: unable to delete 411c8c1f831e (must be forced) - image is referenced in multiple repositories

删除的时候指定这部分内容:

docker images
#展示内容
REPOSITORY               TAG         IMAGE ID       CREATED       SIZE
17865316777/wdf_docker   wdfimage1   411c8c1f831e   3 hours ago   159MB
15433/wdf_docker         wdfimage1   411c8c1f831e   3 hours ago   159MB
nginx                    latest      62d49f9bab67   9 days ago    133MB
ubuntu                   latest      26b77e58432b   2 weeks ago   72.9MB
hello-world              latest      d1165f221234   6 weeks ago   13.3kB


docker rmi 17865316777/wdf_docker:wdfimage1

iptables: No chain/target/match by that name.

启动docker service的时候网关是关闭的,那么docker管理网络的时候就不会操作网管的配置(chain docker),然后网关重新启动了,导致docker network无法对新container进行网络配置,也就是没有网管的操作权限,做重启处理
重启docker即可解决:

systemctl restart  docker

unable to configure the Docker daemon with file

启动参数(flag)和配置文件 /etc/docker/daemon.json 的仓库冲突了
解决:/etc/docker/daemon.json 文件,把里面的内容只保留 {}

tomcat404问题

因为当前的webapps目录是空的,目录使用了另一个文件目录。
先进入tomcat的根目录,删除原来的webapps,把webapps.dist重命名webapps

docker exec -it tomcat id /bin/bash
rm -r webapps
mv webapps.dist webapps

阿里云的访问不了服务

访问不了tomcat:
弄了好久外部访问不了阿里云上docker的tomcat,端口设置的8080。其实一般的问题会出现404等问题,但是我这个一直是什么也不提示。所以问题很严重。最后鼓捣了很久还是安全组的问题。
要么使用全部的入口开放,要么就单独把8080加进去。

请添加这条安全组规则:
授权策略 优先级 协议类型 端口范围 授权对象
允许 110 全部 ICMP(IPv4) 目的:-1/-1 源:0.0.0.0/0

参考:
[1]: https://blog.csdn.net/u013948858/article/details/83115388
[2]: https://blog.csdn.net/guangyacyb/article/details/85242613
[3]: https://blog.csdn.net/zzq060143/article/details/91050272
[4]: https://blog.csdn.net/qq_43263647/article/details/105261897
[5]: https://blog.csdn.net/qq_43263647/article/details/105261897

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值