docker的相关概念
docker是一个做系统虚拟化的软件,跟vmware类似,虚拟出来的也是操作系统。我们现在在企业中, 使用docker虚拟出来的系统,大多都是linux系统。
docker镜像image:就是虚拟一个docker容器需要的操作系统、服务的依赖、服务包,打包成的一个文 件。
docker容器 container:就是用docker软件虚拟出来的一个linux操作系统。
docker仓库:就是管理镜像的地方。
- 公有仓库:hub.docker.com,所有人都可以在这里免费下载镜像
- 私有仓库: 管理私有镜像的仓库
docker的操作系统是一个不完整的操作系统。部署项目的操作系统,有很多操作系统的功能是不需要的。把一些不需要的功能,全部从操作系统中移出出去。那么这个操作系统就给变得非常小了。小到这 个操作系统,只有三个部分是必须的:cgroups、namespace、unionFS。所以容器就可以变得非常小。所以,它占用宿主机的资源就很小。所以一台机器就可以参数更多容器出来。
因为docker容器的操作系统,砍掉了很多功能,所以里面可以执行linux命令,但是不是所有的命 令都可以执行。
一个宿主机上,给运行多个docker容器,容器与容器之间默认是相互隔离的。
docker安装
yum install -y yum-utils device-mapper-persistent-data lvm2
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl restart docker # 重启
systemctl enable docker #开机自启动
sudo vim /etc/docker/daemon.json
添加国内阿里镜像源(阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台)注册
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com",
"https://your-mirror.mirror.aliyuncs.com"
]
}
重新载入文件
systemctl daemon-reload
重启docker服务
systemctl restart docker.service
docker命令使用,需要超管权限。
获取帮助: docker --help
查看到docker子命令的帮助: docker command --help
常用到命令
镜像相关命令
-
下载镜像到本地
- 命令用法: docker pull 镜像名称:tag
- 默认是从docker官方网站上下载镜像:
- 下载tomcat为8.0.53 jre为7的tomcat镜像
-
docker pull tomcat:8.0.53-jre7-alpine
- 默认是从docker官方网站上下载镜像:
-
搜索容器mysql
-
docker search mysql
-
-
列出所有本地镜像
-
docker images
-
-
删除本地镜像
-
docker rmi [OPTIONS] IMAGE [IMAGE...]
- 常用选项
-f
或--force
: 强制删除镜像,即使它正在被使用。--no-prune
: 不删除未标记的父级镜像。
-
- 删除单个镜像
-
docker rmi my_image
-
- 删除多个镜像:
-
docker rmi image1 image2 image3
-
- 强制删除镜像:
-
docker rmi -f my_image
-
- 删除所有未使用的镜像:
-
docker image prune -a
-
容器相关命令
-
创建容器并运行
docker run -itd --cpus 1 --memory 2G --name tomcat-kyj-1 -p 6666:8080 tomcat:8.0.53-jre7-alpine
- docker create 只是创建一个新容器,创建之后,并没有运行。
- 使用docker run 命令,常用选项参数:
-
基本用法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用选项
- `-d` 或 `--detach`: 在后台运行容器,并打印容器 ID。
- `-i` 或 `--interactive`: 保持 STDIN 打开,即使没有附加。
- `-t` 或 `--tty`: 分配一个伪终端。
- `-p` 或 `--publish`: 将容器的端口发布到主机。
- `-v` 或 `--volume`: 绑定挂载一个卷。
- `-e` 或 `--env`: 设置环境变量。
- `--name`: 为容器指定一个名称。
- `--rm`: 容器退出时自动删除容器。
- `-w` 或 `--workdir`: 设置容器内的工作目录。1. **在后台运行一个容器**:
docker run -d tomcat:8.0.53-jre7-alpine
2. **交互式运行一个容器**:
docker run -it tomcat:8.0.53-jre7-alpine /bin/bash
这个命令会启动一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并打开一个交互式的 bash shell。
3. **发布端口**:
docker run -d -p 8080:80 tomcat:8.0.53-jre7-alpine
这个命令会在后台运行一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并将容器的 80 端口映射到主机的 8080 端口。
4. **绑定挂载卷**:
-
docker run -v <主机目录>:<容器目录> <镜像名称>
docker run -d -v /opt/andy:/andy tomcat:8.0.53-jre7-alpine
这个命令会在后台运行一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并将主机上的 `/opt/andy` 目录挂载到容器的 `/andy` 目录。(注意:此方法会重新创建一个新的容器)
-
挂载当前目录到对应的容器目录
-
-
启动现有的容器
-
提交现有容器为新镜像(原镜像上挂载)docker start lemon-erp-1
-
-
使用新镜像创建并挂载卷:docker commit ea42d427123e my-tomcat-image
docker run -d --name tomcat-kyj-1 -v $(pwd):/app my-tomcat-image
-
查看挂载卷是否成功
-
docker inspect
命令可以显示容器的详细信息,包括挂载卷的信息。在输出中,查找Mounts
部分,它会显示所有挂载的卷信息,包括源路径和目标路径。
-
-
docker inspect tomcat-kyj-1
-
5. **设置环境变量**:
docker run -d -e MY_ENV_VAR=my_value tomcat:8.0.53-jre7-alpine
这个命令会在后台运行一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并设置一个名为 `MY_ENV_VAR` 的环境变量,其值为 `my_value`。
6. **指定容器名称**:
docker run -d --name my_nginx tomcat:8.0.53-jre7-alpine
这个命令会在后台运行一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并将其命名为 `my_nginx`。
7. **自动删除容器**:
docker run --rm -it ubuntu /bin/bash
这个命令会启动一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并在退出时自动删除容器。
8. **设置工作目录**:
docker run -d -w /app tomcat:8.0.53-jre7-alpine
这个命令会在后台运行一个基于 `tomcat:8.0.53-jre7-alpine` 镜像的容器,并将其工作目录设置为 `/app`。
-
-
重命名容器
-
docker rename old_container new_container
-
-
停止docker运行中中的容器
-
docker stop 容器名称或容器id
-
docker stop exciting_kilby
-
-
-
删除容器
-
docker rm c57c75c82189
-
-
查看容器日志
-
docker logs 容器名称或容器id
-
docker logs centos7_mysql57
-
-
-
查看容器状态
- docker ps 查看容器状态(默认时只显示正在运行的容器,跟上-a参数,显示所有的容器‘容器id’和‘容器的名称’)
-
-
docker ps docker ps -a
-
-
查看容器的运行状态
-
docker stats 容器名称或容器id,
-
docker stats centos7_mysql57
-
-
查看容器的相关信息
-
docker inspect 容器名称或容器id
-
docker inspect centos7_mysql57
-
在一个运行中的容器中执行命令
-
docker exec
- docker exec -it 容器名称或容器id /bin/bash 进入容器内部,使用bash命令一般情况 使用bash,也可以使用sh
-
docker exec -it my_container /bin/bash
在这个命令中:
-it
表示以交互模式运行命令,并分配一个伪终端。my_container
是容器的名称或 ID。/bin/bash
是在容器中启动的 shell。-
docker exec -it 0562d8625a2e /bin/bash
-
- exit 退出容器
-
exit
-
- docker exec -it 容器名称或容器id /bin/bash 进入容器内部,使用bash命令一般情况 使用bash,也可以使用sh
-
容器网络相关
- docker network 容器网络 docker network ps显示所有的容器网络
-
创建一个网络
-
docker network create andy_work
-
-
查看所有的容器网络
-
docker network ls
-
-
连接容器到网络
-
docker network connect andy_work ea42d427123e
-
-
查看网络信息
-
docker network inspect andy_work
-
-
删除网络
-
docker network rm my_bridge_network
-
-
拷贝文件到容器
- docker cp 拷贝
- docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- 从容器中拷贝到本地路径
- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH 从本地拷贝到容器中某个路径
创建mysql数据库容器
下载mysql镜像mysql:5.7
docker pull daocloud.io/mysql:5.7
根据下载的镜像创建容器,设置端口映射和密码
docker run -itd --name my-mysql-lenmon -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/mysql:5.7
创建好了数据库容器之后,创建lemon_erp库,对库进行初始化操作
下面就可以用数据库软件连接到这个容器了,宿主机的ip和刚设置的端口及密码
docker pull openjdk:8
docker run -itd --name erp-1 -p 8882:8082 openjdk:8
docker cp lemon_erp.jar erp-1:/opt/lemon_erp.jar
docker cp config/ erp-1:/opt/config/
# 修改 config文件夹中 application-dev.yml文件中数据库的配置,可以修改了再传上去
docker cp application-dev.yml erp-1:/opt/config/application-dev.yml
docker exec -it erp-1 /bin/bash
cd /opt
# 启动项目
nohup java -jar lemon_erp.jar &
exit
实战
下载数据库并创建数据库
下载mysql镜像并创建数据库容器(见上方)
创建对应的数据库并运行对应的sql语句
下载tomcat镜像并创建容器
docker pull tomat:jre8
创建容器
docker run -itd --name lemon-erp-1 -p 8882:8082 livingobjects/jre8
进入容器
docker exec -it lemon-erp-1 /bin/bash
解压并进入
修改application.yml文件
修改application-dev.yml,(修改mysql的端口和地址)
查看mysql容器的端口和ip地址(获取mysql的信息)
修改application-dev.yml端口,ip也可以修改为宿主机的网络地址
将对应的内容拷贝进容器
docker cp lemon_erp.jar lemon-erp-1:/opt
docker cp config/ lemon-erp-1:/opt
进入容器内部启动项目
docker exec -it lemon-erp-1 /bin/bash
java -jar lemon_erp.jar
查看拷贝的内容
ls
最后访问项目地址就可以了http://ip:8882/doc.html#/home
修改容器网络连接
(注意数据库的地址要和创建时的密码一致)
一、直接连接docker中mysql的ip地址(比第二种方法好)
先查看mysql在docker中的ip地址
docker inspect my-mysql-lenmon
从上图可以看出我的mysql在docker中的网络地址为172.17.0.2
修改对应的网络地址
vi application-dev.yml
二、修改为主机的ip地址和端口
三、新增一个局域网络,将两个容器加入到这个局域网
查看刚创建的网络
docker network ls
查看网络信息
docker network inspact andy_work
从上图可以看见该局域网的网段信息
将对应的容器加入到该局域网
docker network connect andy_work my-mysql-lenmon
docker network connect andy_work lemon-erp-1
查看网络详情可以看见对应的容器已经加入到该局域网中
docker network inspect andy_work
监控docker
详见这里
grafana + Prometheus + docker监控
cadvisor
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --
volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --
volume=/dev/disk/:/dev/disk:ro --publish=8880:8080 --detach=true --name=cadvisor
--privileged --device=/dev/kmsg google/cadvisor
修复prometheus.yml
启动Prometheus和grafana
引入模板 193
如果公司用k8s,它的配置文件yml文件,与dockerfile类似。
docker 与 k8s
docker是一个用于管理和创建容器的软件
k8s,是容器的集成管理工具,这个工具集成了docker的能力。
以前,k8s创建容器,就是用docker
所以掌握了 docker知识k8s的使用就变得简单了。