Docker

  • Docker已关闭评论
  • 17 次浏览
  • A+
所属分类:linux技术
摘要

解决了:应用部署的环境问题依赖兼容问题操作系统环境差异如何解决:Docker是一个CS架构的程序,由两部分组成


Docker

解决了:

应用部署的环境问题

依赖兼容问题

操作系统环境差异

如何解决:

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像,
  • Docker应用运行在容器中,使用沙箱机制,相互隔离
  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

1.优势

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

2.架构

Docker是一个CS架构的程序,由两部分组成

服务端:Docker守护进程,负责处理Docker指令,管理镜像、容器等。

客户端:通过命令或RestApi向Docker服务端发送指令。

Docker

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起成的文件包,称为镜像。这个文件包是只读的

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。因此一个镜像可以启动多次,形成多个容器进程。

服务端:接收命令或远程请求,操作镜像或容器

客户端:发送命令或者请求到Docker服务端

Docker Hub:

一个镜像托管的服务器,类似的还有阿 里云镜像服务,统称为DockerRegistry

3.安装

见centos7安装docker笔记

4.基本命令

镜像命令

docker pull redis 拉取dockerHub的镜像

docker images 查看拉取到的镜像

docker save -o redis.tar redis:latest 保存镜像为tar文件

docker rmi redis:latest 删除镜像文件

docker load -i redis.tar 加载镜像

Docker

容器命令

Docker

举例:运行nginx容器

docker run --name mynginx -p 80:80 -d nginx 

docker run :创建并运行一个容器

--name : 给容器起一个名字,比如叫做mn

-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口

-d:后台运行容器

nginx:镜像名称,例如nginx-gyb

举例:运行redis,并持久化数据

#运行redis docker run --name myRedis -p 6379:6379 -d redis redis-server --appendonly yes 
#进入redis容器中 docker exec -it myRedis bash 

进入容器后启动redis客户端

redis-cli 

设置值

set num 1 

5.数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

•将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

Docker

基本操作

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume
  • inspect 显示一个或多个volume的信息
  • ls 列出所有的volume
  • prune 删除未使用的volume
  • rm 删除一个或多个指定的volume

举例

创建一个名为html的数据卷

 docker volume create html 

展示所有数据卷

 docker volume ls 

查看数据卷详细信息卷

 docker volume inspect html 

挂载数据卷

在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录

Docker

挂载目录

运行mysql,并挂载data和conf目录

  1. 将mysql镜像加载
  2. 运行镜像,并配置密码,端口,挂载目录
docker run   --name mysql   -e MYSQL_ROOT_PASSWORD=gyb20010204   -p 3306:3306   -v /root/temp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf   -v /root/temp/mysql/data:/var/lib/mysql   -d   mysql:5.7.25 

-e :传递环境变量

-p:映射端口

-v:挂载(外部服务器地址:镜像地址)

-d:在后台运行容器

挂载区别

Docker

6.自定义镜像

1.镜像结构

•BaseImage层:包含基本的系统函数库、环境变量、文件系统

•Entrypoint:入口,是镜像中应用启动的命令

•其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

Docker

2.Dockerfile

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

3.创建举例

3.1.基于Ubuntu镜像构建一个新镜像,运行一个java项目

  1. 新建root/temp/docker-demo文件夹

  2. 拷贝资料中的docker-demo.jar文件到docker-demo这个目录

  3. jdk8.tar.gz文件到docker-demo这个目录

  4. Dockerfile到docker-demo这个目录

    # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local  # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /root/temp/app.jar  # 安装JDK RUN cd $JAVA_DIR   && tar -xf ./jdk8.tar.gz   && mv ./jdk1.8.0_144 ./java8  # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin  # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /root/temp/app.jar 
  5. 运行命令

#-t 代表--tag指定名称和版本, 最后的点(.)代表DockerFile的所在目录--当前目录 docker build -t javaweb:1.0 . 
  1. 开放8090端口

  2. 访问http://116.62.32.68:8090/hello/count

    Docker

也可以将基础的命令替换为 基础镜像:java:8-alpine

# 指定基础镜像 FROM java:8-alpine  COPY ./docker-demo.jar /root/temp/app.jar  # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /root/temp/app.jar 

7. Docker Compose

  • Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
  • Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

3.2运行cloud-domo微服务

1.将各微服务的nacos地址和mysql的ip地址换为服务名,如nacos和mysql

Docker

2.将服务打包为app.jar

3.编写各微服务的Dcokerfile文件放在文件夹中

4.编写整体的DockerCompose.yaml文件(nacos的jvm分配调低)

5.将准备好的文件和jar包(cloud-domo文件)传入linux中

6.进入到docker-compose.yml所在文件夹

7.输入命令:

docker-compose up -d 

此时会因为nacos启动慢导致其他微服务启动失败,因此需要重新启动其他微服务

 docker-compose restart userservice orderservice mysql gateway 

8.最后可以访问网关端口号进行资源路径的访问

Docker

7. Docker镜像仓库

带有图形化界面版本

1.创建docker-compose.yml文件内容如下:

version: '3.0' services:   registry:     image: registry     volumes:       - ./registry-data:/var/lib/registry   ui:     image: joxit/docker-registry-ui:static     ports:       - 8080:80     environment:       - REGISTRY_TITLE=坚球私有仓库       - REGISTRY_URL=http://registry:5000     depends_on:       - registry 

2.配置docker信任地址,并重新加载

# 打开要修改的文件 vi /etc/docker/daemon.json # 添加内容: "insecure-registries":["116.62.32.68:8080"] # 重加载 systemctl daemon-reload # 重启docker systemctl restart docker 

Docker

3.重命名镜像(必须)

docker tag nginx:latest 116.62.32.68/nginx:1.0 

4.推送镜像到仓库

docker push 116.62.32.68:8080/nginx:1.0 

5.拉取

docker pull 192.168.150.101:8080/nginx:1.0  
  • 版权声明:本站原创文章,于2022年10月31日23:51:36,由 发表,共 3901 字。
  • 转载请注明:Docker - 张拓的天空