# 基本概念
# 解决的问题
# 统一标准
- 应用构建
- 应用分享
- 应用运行
# 资源隔离
- cpu、memory资源隔离与限制
- 访问设备隔离与限制
- 网络隔离与限制
- 用户、用户组隔离限制
- ......
# 架构
- Docker_Host:
- 安装Docker的主机
- Docker Daemon
- 运行Docker主机上的Docker后台进程
- Client
- 操作Docker主机的客户端(命令行、UI等)
- Registry
- 镜像仓库
- Docker Hub
- Images
- 镜像,带环境打包好的程序,可以直接启动运行
- Containers:
- 容器,由镜像启动起来正在运行中的程序
交互逻辑
装好Docker,然后去 软件市场 寻找镜像,下载并运行,查看容器状态日志等排错
# 安装docker
后续添加
# 命令
# 常用命令
# 找镜像
拉取镜像
docker pull nginx #下载最新
镜像名:版本名(标签)
docker pull nginx:1.20.1
docker pull redis #下载最新
docker pull redis:6.2.4
查看所有镜像
## 下载来的镜像都在本地
docker images #查看所有镜像
redis= redis:latest
删除镜像
docker rmi 镜像名:版本号/镜像Id
# 启动容器
启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 启动nginx应用容器,并映射88端口,测试的访问
# -d:后台运行
# --restart=always: 开机自启
docker run --name=mynginx -d --restart=always -p 88:80 nginx
查看容器
# 查看所有正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 删除停止的容器
docker rm 容器id/名字
docker rm -f 容器id/名字 #强制删除
停止容器
docker stop 容器id/名字
再次启动
docker start 容器id/名字
配置开机自启
#应用开机自启
docker update 容器id/名字 --restart=always
# 修改容器内容
进入容器内部修改
# 进入容器内部的系统,修改容器内容
docker exec -it 容器id /bin/bash
挂载数据到外部修改
docker run --name=mynginx \
-d --restart=always \
-p 88:80 -v /data/html:/usr/share/nginx/html:ro \
nginx
# 修改页面只需要去 主机的 /data/html
这里将nginx的html目录挂载到宿主机,但是因为宿主机的html目录是空的,所以导致该容器的挂载目录也是空的,反应到页面上就是没有Nginx的欢迎页面
# 提交改变
将自己修改好的镜像提交
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "kungfucheng" -m "首页变化" 341d81f7504f kungfucheng/chengyinginx:v1.0
-a, --author string Author (e.g., "John Hannibal Smith hannibal@a-team.com") -c, --change list Apply Dockerfile instruction to the created image -m, --message string Commit message -p, --pause Pause container during commit (default true)
镜像传输
# 将镜像保存成压缩包
docker save -o abc.tar chengyinginx:v1.0
# 别的机器加载这个镜像
docker load -i abc.tar
# 推送到远程仓库课
docker push kungfucheng/chengyinginx:v1.0
# 别的机器下载
docker pull kungfucheng/chengyinginx:v1.0
其实和git一样,先提交,然后推送 这里提交以后,列出镜像会发先提交以后会有tag,就是上面传入的:后面的v1.0,如果不写则为latest,如果想要更改版本或者提交的名称可以使用如下命令,创建新的镜像
docker tag kungfucheng/chengyinginx kungfucheng/chengyinginx:v1.3
# 补充
查看日志
docker logs 容器名/id
把容器指定位置的东西复制出来
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf /data/conf/nginx.conf
把外面的内容复制到容器里面
docker cp /data/conf/nginx.conf 5eff66eec7e1:/etc/nginx/nginx.conf
# Dockfile
编写Dockerfile将自己的应用打包镜像
- 编写Dockerfile
FROM openjdk:8-jdk-slim
LABEL maintainer=kungfucheng
COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- 构建镜像
docker build -t java-demo:v1.0 .
# 指定dockerfile文件
docker build -f /root/Dockerfile -t java-demo:v1.0 .
- 启动容器
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
- 镜像构建历史
docker history mycentos:7
- Dockerfile常用指令
指令 | 语法 | 说明 |
---|---|---|
FROM | FROM <image>[:<tag>] | 指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest |
MAINTAINER | MAINTAINER <name> | 指明镜像维护者及其联系方式(一般为邮箱地址)。官方说明已过时,推荐使用LABEL |
LABEL | LABEL <key>=<value> | 功能是为镜像指定标签。也可以使用LABEL 来指定镜像作者 |
RUN | RUN <command> | 构建镜像时运行的Shell命令,比如构建的新镜像中我们想在`/usr/local目录下创建一个java目录 |
ADD | ADD <src>...<dest> | 拷贝文件或目录到镜像中。src 可以是一个本地文件,还可以是一个url。然后自动下载和解压 |
COPY | COPY <src>...<dest> | 拷贝文件或目录到镜像中。用法同ADD ,只是不支持自动下载和解压 |
EXPOSE | EXPOSE [<port>/<protocol>...] | 暴露容器运行时的监听端口给外部,可以指定端口是监听TCP还是UDP,默认为TCP |
ENV | ENV <key><value> | 设置容器内环境变量 |
CMD | CMD ["executable", "param1", "param2"] | 启动容器时执行的Shell命令。在Dockerfile中只能有一条CMD 指令。如果设置了多条CMD ,只有最后一条会生效 |
ENTRYPOINT | ENTRYPOINT ["executable", "param1", "param2"] | 启动容器时执行的Shell命令,类似CMD ,不会被docker run 命令行指定的参数所覆盖,如果设置了多条ENTRYPOINT ,只有最后一条会生效 |
WORKDIR | WORKDIR <param> | 为RUN 、CMD 、ENTRYPOINT 以及COPY 和ADD 设置工作目录 |
VOLUME | VOLUME ['param'] | 指定容器挂载点到宿主机自动生成的目录或其他容器。一般使用场景为需要持久化存储数据时 |