Docker
Docker
0.虚拟机和容器
0.1.虚拟机
通过将应用程序部署在不同的虚拟机中从而实现隔离
0.2.容器
与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置
0.3.什么是docker
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到[docker container](https://www.zhihu.com/search?q=docker container&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"187505981"}),这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,程序员再也无法施展表演才华了,不会再有“在我的环境上可以运行”,真正实现“build once, run everywhere”。
此外docker的另一个好处就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。
0.4.如何使用docker
docker中有这样几个概念:
- dockerfile
- image
- container
实际上你可以简单的把image理解为可执行程序,container就是运行起来的进程。
那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。
因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。
1.Linux安装Docker
1.1.卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine \ docker-ce
1.2.安装docker
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken
然后更新本地镜像源
yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
最后安装docker
yum install -y docker-ce
1.3.关闭防火墙
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
# 关闭 systemctl stop firewalld # 禁止开机启动防火墙 systemctl disable firewalld #查看是否关闭防火墙 systemctl status firewalld
1.4.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务
创建文件夹:sudo mkdir -p /etc/docker
# 在文件夹内新建一个daemon.json文件 touch /etc/docker/daemon.json { "registry-mirrors": ["https://akchsmlh.mirror.aliyuncs.com"] }
最后重新加载文件(完成)
sudo systemctl daemon-reload
2.Docker命令
2.1.docker 基础命令
#启动docker
1.systemctl start docker
#关闭docker
2.systemctl stop docker
#重启docker
3.systemctl restart docker
#查看docker的运行状态
4.systemctl status docker
#查看docker的版本号信息
5-1.docker info(更详细的)
5-2.docker version
2.2.docker 镜像命令
#查看镜像
1.docker images
#搜索镜像
2.docker search 镜像名
#拉取镜像:
3-1.docker pull 镜像名(不指定版本默认是latest)
3-2.docker pull 镜像名:镜像版本(Tag)
3-3.例如:docker pull mysql:5.7.30
#运行镜像
4-1.docker run 镜像名
4-2.docker run 镜像名:Tag
4-3.例如:docker run tomcat | docker run tomcat:8.0.52
#删除镜像 ------ 当前镜像没有被任何容器使用才可以删除
5-1.docker image rm 镜像名称/镜像ID
5-2.docker rmi 镜像名称/镜像ID(简写)
#强制删除镜像(连容器一起删除)
6-1.docker image rm -f 镜像名称/镜像ID
# 简写
6-2.docker rmi -f 镜像名/镜像ID
#删除多个 其镜像ID或镜像用用空格隔开即可
8.docker rmi -f 镜像名/镜像ID
#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
9-1.docker rmi -f $(docker images -aq)
9-2.docker images -a:查看所有镜像(a -> all)
9-3.docker images -q:查看所有镜像的id
2.3.docker 容器命令
#查看正在运行的容器
1.docker ps
#查看正在运行的容器id
2.docker ps -q
#查看曾经运行过的容器
3.docker ps -a (包括正在运行的和已停止的)
#运行容器(创建容器):
4.docker run -d -p 宿主机端口:容器端口 --name 要取的别名 镜像名:版本号(镜像id)
例如运行tomcat:docker run -d -p 8080:8080 --name mytomcat tomcat:8.0.52
#与容器内部进行交互(进入容器的命令行模式)
5.docker exec -it 容器id/容器名 bash
#直接容器停止并退出
6.exit
#操作系统与容器的传输文件
# 内->外
7-1.docker cp 容器ID/名:容器内资源路径/文件名 操作系统中的路径/自定义拷贝出来的文件名
# 外->内
7-2.docker cp 文件/目录 容器id:容器路径/自定义拷贝出来的文件名
8.#查看容器内服务运行日志(实时)
docker logs -f 容器id/容器名
#容器不停止退出
9.ctrl + P + Q
#启动/停止/重启容器
10.docker start/stop/restart 容器ID/容器名
#删除容器
11.docker rm 容器名/容器ID
#最近创建的容器
12.docker ps -a -n=1
#杀死容器
13.docker kill 容器ID/容器名 ------ 杀死之后不能再以docker start方式启动
#查看进程信息
14.docker top [镜像id]
镜像好比Java中的类
容器是镜像的一个实例,好比Java中的一个对象
线程的五种状态:创建,就绪,运行,阻塞,死亡
newFixedThreadPool
newCachedThreadPool
newSingleThreadExecutor
线程池的五种状态:Running - ShutDown - Stop - Tidying - Terminated
如何保证多线程运行安全:原子性,可见性,有序性
如何防止死锁:互斥条件,请求和保持条件,不可剥夺条件,环路等待条件