docker
疫情期间在家办公,docker搭建工作环境应用整理。很多也是来自简书和网络。这里给需要的人~
docker的宿主系统是centos,为什么可以运行ubuntu的镜像呢?
首先需要区分Linux内核与Linux发行版
Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等等...
Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等等...
CentOS与Ubuntu是不同的Linux发行版, 它们都是基于Linux内核, 只是添加的工具软件不同。比如, 他们的软件包管理系统不同, CentOS使用yum命令安装软件, 而Ubuntu使用apt-get命令安装软件。
因此CentOS与Ubuntu的内核是相同的(版本可能不同), 只是所安装的软件不同, 即文件系统不同。
Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块:
Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程。
Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数。
在CentOS上运行基于Ubuntu镜像的容器时, 容器使用了CentOS主机的内核以及Ubuntu镜像, Ubuntu镜像中安装了Ubuntu的各种软件(apt-get)。
基础镜像
根据Dockerfile制作:
//www.greatytc.com/p/482aed037ac4
//Dockerfile制作镜像 入口点和CMD的区别,入口点可以携带docker run的参数, RUN 指令,用于运行程序,但二者运行的时间点不同;CMD 在docker run 时运行,而非docker build;
sudo docker build -t xxx/xxx:1.0 . //制作命令,后面的.为当前Dockerfile所在目录
https://hub.docker.com///官方镜像web
https://blog.csdn.net/nklinsirui/article/details/80967677
docker 运行ubuntu镜像
https://www.cnblogs.com/lsgxeva/p/8746644.html
docker run ubuntu / docker pull ubuntu //获取
docker run -i -t ubuntu /bin/bash //运行
docker镜像没有ifconfig,ping
apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping
docker 制作新镜像
docker commit <container id> <image name>
sudo docker commit 85074428a3dc ifconfig-ubuntu
把正在用的系统制作成镜像:
https://blog.csdn.net/tiantao2012/article/details/82425660
1.选定制作成镜像的系统
2.系统进行格式转化并压缩,执行如下命令,生成一个镜像的centos7-base.tar的文件
tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7-base.tar /
3.docker import 导入 把镜像文件centos7-base.tar放到装有docker的系统上
docker import centos7-base.tar 自定义images名字
4.docker images 查看后使用即可
docker run -it --name images名字 /bin/bash
docker镜像导出导入
$ sudo docker save -o /home/user/images/ubuntu_14.04.tar ubuntu:14.04 //导出
$ sudo docker load --input ubuntu_14.04.tar//导入
docker容器导入导出
docker export
docker import
docker import/export 和load/save 区别
docker save images_name:将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
docker export container_id:将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。
docker与宿主机copy
1、从容器里面拷文件到宿主机?
答:在宿主机里面执行以下命令
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?
答案:在宿主机上面执行命令
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
2、从宿主机拷文件到容器里面
答:在宿主机里面执行如下命令
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?
答案:在宿主机上面执行如下命令
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
3.需要注意的是,不管容器有没有启动,拷贝命令都会生效。
docker pull的镜像保存在哪里?
https://www.cnblogs.com/Rightsec/p/10222950.html
https://blog.csdn.net/ncdx111/article/details/79878098//docker 本地镜像导入,导出
docker java镜像选型参考
https://blog.csdn.net/boling_cavalry/article/details/94320638
docker pull openjdk:8-jdk-slim
docker run...
docker run Imageid //根据image运行容器
docker ps ; docker ps -a //查询容器,-a显示所有包括没有运行的容器
docker start 容器id //启动已经exit的容器
docker exec -it 容器id bash //bash 交互执行已经启动的容器,注意-it 的位置,如果不能执行,将-it放到前面
TIPs:退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束,可以使用[ctrl + P + Q]退出而不终止容器运行 //持续运行
持续运行:
docker run -p 80:8090 -it -d xxx/xxx:1.2 /bin/bash //这个方式会启动后台持续运行,记得加-d和/bin/bash运行
docker run -it imageid //这个方式会有一个/bin/bash启动,因而docker start时会持续运行
docker start containerid //启动
docker restart containerid //重启
docker attach containerid //附着
docker rm containerid // 删除容器
docker rmi imageid //删除image,-f 强制
docker run mysql
https://www.cnblogs.com/haoprogrammer/p/11008786.html
# docker pull mysql:5.7.26 //拉取mysql镜像
# docker run -p 3306:3306 --name mysql-5.7.26 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.26//启动mysql 容器
# docker exec -it mysql-5.7.26 bash //启动容器bash
mysql -uroot -p123456 //运行mysql
other ref:
docker run -p 13306:3306 --name my-mysql -v $PWD/conf:/etc/mysql -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.26
-v $PWD/conf:/etc/mysql将主机当前目录下的 conf/ 挂载到容器的 /etc/mysql (conf目录为mysql的配置文件,不挂载也没问题)
docker mysql容器重启后数据会丢失,commit也不行,需要映射host目录,参考: 数据持久化:https://blog.csdn.net/weixin_39791387/article/details/93375560
docker container配置修改
docker container update --restart=always 容器名字 #更改restart项为always,经测试,这个配置支持os重启后自动启动
docker container update --restart=no 容器名字 #取消自动重启
docker维护
docker inspect 容器id //查看容器的配置,如ip地址,端口等
docker中启动关闭删除所有的容器命令
docker中 启动所有的容器命令
dockerstart $(docker ps -a | awk'{ print$1}'| tail -n +2)
docker中 关闭所有的容器命令
dockerstop $(docker ps -a | awk'{ print$1}'| tail -n +2)
docker中 删除所有的容器命令 -f//强制
dockerrm $(docker ps -a | awk'{ print$1}'| tail -n +2)
docker中 删除所有的镜像
dockerrmi $(docker images | awk'{print$3}'|tail -n +2)
tail -n +2 表示从第二行开始读取
docker构建多平台镜像
//www.greatytc.com/p/ff865a5a051b
docker日志
https://blog.csdn.net/warrior_0319/article/details/79713155
docker资源限制
https://blog.csdn.net/wuyundong123/article/details/103401930//ubuntu 开启资源限制
docker拷贝本地文件或者文件夹到容器
docker cp /home/xxx targetContainerId:/home/xxx