填个坑
Docker是什么?
Docker 属于 Linux 容器的一种封装,提供一整套虚拟运行环境,提供简单易用的容器使用接口。Docker能将应用程序部署到虚拟容器中,让程序可以在这个虚拟容器中运行,与外界环境隔离。
Docker架构
Docker更详细的架构如图所示,采用CS架构,client通过RESTFUL API发送docker命令到docker daemon进程,docker daemon进程执行镜像编译,容器启停以及分发,数据卷管理等,一个client可以与多个docker daemon通信。
- Docker Daemon:Docker后台进程,用于管理镜像,容器以及数据卷。
- Docker Client:用于与Docker Daemon交互。
- Docker Registry:用于存储Docker镜像,类似github,公共的Registry有Docker Hub和Docker Cloud。
- Images:镜像是用于创建容器的一种只读模板。镜像通常基于一个基础镜像,在此基础上安装额外的软件。比如你的nginx镜像可能基于debian然后安装nginx并添加配置,你可以从Docker Hub上拉取已有的镜像或者自己通过Dockerfile来编译一个镜像。
- Containers:容器是镜像的一个可运行示例,我们可通过Docker client或者API来创建,启停或者删除容器。默认情况下,容器与宿主机以及其他容器已经隔离,当然你可以控制隔离容器的网络或者存储的方式。
- Services:服务是docker swarm引入的概念,可以用于在多宿主机之间伸缩容器数目,支持负载均衡已经服务路由功能。
Docker解决的问题
- 解决在服务器部署时的环境问题
- 一个程序部署在各个服务器,jdk,mysql版不一致等等
- 一个程序需要的依赖有的没有
- 解决传统虚拟机的痛点
- 占资源多
- 步骤冗余
- 启动慢
Docker语法
镜像操作
查看本地所有镜像
- docker images/docker image ls
删除本地镜像
- docker image rm [image id]/docker rmi [image id]
使用dockerfile创建本地镜像
- docker build
查看指定镜像的创建历史
- docker history [OPTIONS] IMAGE
从归档文件中创建镜像
- dcoker import
容器生命周期管理
创建一个新的容器并运行一个命令
- docker run --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; --env-file=[]: 从指定文件读入环境变量; --expose=[]: 开放一个端口或一组端口; --link=[]: 添加链接到另一个容器; --name="nginx-lb": 为容器指定一个名称; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --volume , -v: 绑定一个卷 -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -e username="ritchie": 设置环境变量; -h "mars": 指定容器的hostname; -i: 以交互模式运行容器,通常与 -t 同时使用; -m :设置容器使用内存最大值; -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -P: 随机端口映射,容器内部端口随机映射到主机的端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 启动容器
启动/停止/重启容器
- docker start/stop/restart
删除容器
- docker rm rm -f 强制删除 docker rm -v 删除容器以及挂在卷 docker rm $(docker ps -a -q) 删除所有停止的容器
杀掉一个运行中的容器
- docker kill
暂停/恢复容器
- docker pause/unpause
创建一个新的容器但不启动它
- docker create
在容器内部额外启动新进程
- docker exec
容器操作
展示所有容器
- docker ps -a
查看docker元数据
- docker inspect
容器中的进程信息
- docker top
连接到正在运行中的容器
- docker attach
docker事件
- docker events
容器的日志
- docker logs
阻塞运行直到容器停止,然后打印出它的退出代码。
- docker wait
到处docker容器为一个tar文件
- docker export
docker端口映射
- docker port
一个或者多个容器的统计信息
- docker stats
docker hub
登陆
- docker login -u 用户名 -p 密码
登出
- docker logout
拉取镜像
- docker pull java
推送镜像
- docker push myapache:v1
从Docker Hub查找镜像
- docker search java
dockerfile
- cmd
- 启动被容器时,要运行的命令
- 会被docker run 覆盖
- 只能被使用一次
- entrypoint
- docker run 命令会追加,不会覆盖
- workdir
- 指定工作目录,cmd,entrypoint都在该路径下执行
- env
- 设置环境变量
- user
- 什么用户去运行
- volume
- 添加卷
- add
- 复制构建环境下的内容进镜像
- copy
- 复制文件进镜像
- label
- 为docker添加元数据
- stopsignal
- 停止容器的时候发送什么信号给系统
- arg
- 运行时变量
- onbuild
- 该镜像被作为基础镜像后,执行
应用
初始入门 使用hello-world镜像
- 输入
docker run hello-world
MacBook-Pro ~ % docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
部署MySQL
- 从docker hub上看到了使用教程,下面根据这个来操作
docker run -p 3310:3306 -itd -e MYSQL_ROOT_PASSWORD=123456 mysql
- docker测试连接成功
dockerfile使用
- 新建一个目录,放入jar包
- dockerfile中写入
FROM java:8
MAINTAINER chenhui
VOLUME /tmp
COPY demo111-0.0.1-SNAPSHOT.jar /app/demo111-0.0.1-SNAPSHOT.jar
WORKDIR /app
EXPOSE 7777
ENTRYPOINT ["nohup","java","-jar","demo111-0.0.1-SNAPSHOT.jar","&"]
- 执行
docker build -t dockerdemo .构建自己的镜像可以看到构建成功
- 执行
docker run -p 7777:7777 -d dockerdemo启动成功
Docker network的使用
-
创建docker network
docker network create my-net -
添加mysql容器进入my-net
docker network connect my-net gallant_cartwright -
添加成功
-
查看mysql容器的hosts
docker exec -it gallant_cartwright /bin/bash
more /etc/hosts
- springboot配置文件修改
- 再次打包启动自定义容器,启动容器
springboot就一个简单的queryAll,这里就不贴代码了