简单使用docker
Posted 冷血~多好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单使用docker相关的知识,希望对你有一定的参考价值。
目录
例子:把容器tomcat里的webapps目录挂载在docker外边实现数据持久化
docker run -itd --name tomcat03 -p 9091:8080 -v tomcat03:/usr/local/tomcat/webapps tomcat
使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
启动 Docker
systemctl start docker
测试命令
查看版本
docker version
测试输出hello
docker run hello-world
查看docker中的镜像
docker images
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像创建时间
SIZE 镜像大小# 同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同
的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!
如果是使用阿里云服务器,可以使用阿里云镜像加速
这里根据自身的阿里云来填写
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
"registry-mirrors": ["https://bwnhdsd6dsdo.mirror.aliyuncs.com"]
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。。
docker --help # 帮助
docker images # 列出本地主机上的镜像
docker search mysql # 搜索镜像 对应DockerHub仓库中的镜像
docker pull 镜像名称 # 下载镜像
# 删除镜像
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个
docker rmi -f $(docker images -qa) # 删除全部
查看容器/镜像的元数据
docker inspect 容器id
启动容器
docker run -it --name 名字 容器id
参数说明:
- -i: 交互式操作。
- -t: 终端。
- hello-word: hello-world 镜像。
- docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式
- --name 给容器命名
停止一个容器
docker stop <容器 ID>
停止的容器可以通过 docker restart 重启:
docker restart <容器 ID>
查看容器
docker ps #在运行的容器
docker ps -a #已创建的容器
进入容器
想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
attach 命令
docker attach [容器id]
exec 命令
docker exec -it [容器id] /bin/bash
删除容器
docker rm -f [容器id]
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
查看容器的cpu内存和网络状态
docker stats 容器id # 查看容器的cpu内存和网络状态
镜像Commit(从容器创建一个新的镜像)
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
例:
容器数据卷
作用:
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此
能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享
使用数据卷
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
例子:把容器tomcat里的webapps目录挂载在docker外边实现数据持久化
docker run -itd --name tomcat01 -p 9090:8080 -v /usr/local/docker-tomcat01/webapps:/usr/local/tomcat/webapps tomcat:9.0
然后就可以把要发布的web应用放在外部目录进行发布,
挂载数据库MySQL
docker pull mysql:5.7
docker run -d -p 3310:3306 -v /usr/local/docker-mysql01/conf:/etc/mysql/conf.d -v /usr/local/docker-mysql01/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7
docker run -p 3307:3306 --name mysql02 \\
-v /usr/local/mysql02/log:/var/log/mysql \\
-v /usr/local/mysql02/data:/var/lib/mysql \\
-v /usr/local/mysql02/conf:/etc/mysql \\
-e MYSQL_ROOT_PASSWORD=root \\
-d mysql
匿名和具名挂载
# 匿名挂载
-v 容器内路径
docker run -itd --name tomcat02 -p 9090:8080 -v /usr/local/tomcat/webapps tomcat
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
# 具名挂载
-v 卷名:/容器内路径
docker run -itd --name tomcat03 -p 9091:8080 -v tomcat03:/usr/local/tomcat/webapps tomcat
# 查看挂载的路径
docker volume inspect [卷名]
# 改变文件的读写权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
DockerFile
dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建步骤:
1、编写DockerFile文件
2、docker build 构建镜像
3、docker run
DockerFile构建过程
基础知识:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!
说明:
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile 是软件的原材料 (代码)
Docker 镜像则是软件的交付品 (.apk)
Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!
DockerFile指令
关键字:
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 容器构建时需要运行的命令
EXPOSE # 当前容器对外保留出的端口
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最
后一个生效!
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的
ONBUILD被触发
例:
自定义一个 centos
1、编写DockerFile
mkdir dockerfile-test
vim mydockerfile-centos # 编辑文件
FROM centos
MAINTAINER xiaobai<123456789@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 8090
CMD echo $MYPATH
CMD echo "----------end--------"
CMD /bin/bash
2、构建
docker build -f dockerfile地址 -t 新镜像名字:TAG . (docker build 命令最后有一个 . . 表示当前目录****)
docker build -f mydockerfile-centos -t mycentos:0.1 .
3、运行
docker run -it 新镜像名字:TAG
CMD 和 ENTRYPOINT 的区别
CMD:Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数
替换!
ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!
自定义镜像 tomcat
创建tomcat文件夹
mkdir tomcat
进入tomcat目录
cd tomcat
在上述目录下 touch read.txt
将 JDK 和 tomcat 安装的压缩包拷贝进上一步目录
新建一个Dockerfile文件(然后填写一下内容)
FROM centos
MAINTAINER chenjinxian<1291759046@qq.com>
#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下/usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u271-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.40.tar.gz /usr/local/
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.40/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.40/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
然后在tomcat目录构建镜像
docker build -t mytomcat .
构建镜像成功
运行启动 run
docker run -itd --name webtomcat01 -p 9091:8080 -v /usr/local/docker-webtomcat01/webapps:/usr/local/apache-tomcat-9.0.40/webapps mytomcat
发布镜像
注册dockerhub https://hub.docker.com,需要有一个账号
1、查看登录命令
docker login --help
2、登录
docker login -u 账号昵称
3.将镜像发布出去
docker push 镜像id
注意镜像名称要带上dockerhub的账号昵称,否则会上传失败
例:xiaobai/id
然后就可以从dockerhub拉取镜像了
docker pull 镜像id
比如通过以下命令拉取上边发布的镜像了
docker pull chenjinxian/webtomcat
IDEA整合Docker
创建项目
1、使用 IDEA 构建一个 SpringBoot 项目
2、编写一个helloController@RestController
public class HelloController
@GetMapping("/hello")
public String hello()
return "hello";
3、启动测试
4、打jar包
打包镜像
1、在项目下编写 Dockerfile 文件,将打包好的jar包拷贝到Dockerfile同级目录
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
2.将Dockerfile 和 项目的 jar 包上传到linux服务器上,构建运行
# 构建镜像
docker build -t springboot-test .
# 查看镜像
docker images# 运行
docker run -itd -p 9092:8080 --name springboot01 springboot-test
# 测试访问
以上是关于简单使用docker的主要内容,如果未能解决你的问题,请参考以下文章