# 基本概念

# 解决的问题

# 统一标准

  • 应用构建
  • 应用分享
  • 应用运行

# 资源隔离

  • 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> RUNCMDENTRYPOINT以及COPYADD设置工作目录
VOLUME VOLUME ['param'] 指定容器挂载点到宿主机自动生成的目录或其他容器。一般使用场景为需要持久化存储数据时
Last Updated: 11/29/2024, 11:16:39 AM