Docker安装
Docker的组成结构
镜像:
Docker的镜像就像是一个模板,可以荣国这个模板来创建容器服务
例子:
tomcat ====》run ===》tomcat01容器(提供服务)
我们可以同过镜像创建多个容器(最终服务运行或者是项目运行都是在容器中的)
容器:
Docker利用容器技术,独立运行一个或者一组应用,通过容器来创建的
启动,停止,删除,等基本命令
目前我们可以把容器理解为一个建议的linux系统,项目都是跑在系统上的
仓库:
仓库就是存放镜像的地方
有私有的有共有的
DockerHub
阿里云等等厂商都有镜像服务
安装Docker
环境准备
需要会一点点linx的基础
linux : CentOS7
使用连接工具连接服务器操作
确认系统环境
[root@iZwz90ps06ioyada63oiwiZ ~]# uname -r 3.10.0-957.21.3.el7.x86_64
[root@iZwz90ps06ioyada63oiwiZ ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
官方文档可以看到要求:
我们如果是用的linxu系统是 CentOS 那么必须是 7 版本以上才支持的
如果安装装过的话,建议删除之前的旧版本的docker
#1·卸载掉旧的版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #2 需要的安装包 sudo yum install -y yum-utils #3设置镜像的仓库,默认是国外的(建议大家使用阿里云的镜像) sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #4 安装docker相关的内容 yum install docker-ce docker-ce-cli containerd.io #5 安装之后测试是否安装成功 systemctl start docker #6查看docker的版本号 docker version
之后查看我们docker的版本即可
#7 运行docker的helloword
docker run hello-world
# 8 如何查看docker下载的镜像呢?
docker images
# 就可以查看docker下载的位置了
了解 如何卸载docker
#1 卸载docker的相关内容 yum remove docker-ce docker-ce-cli containerd.io #2 卸载docker的和我们下载容器 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd # /var/lib/docker 是 docker的默认工作路径
提升效率
阿里云的容器加速
登录阿里云找到容器服务
找到镜像加速地址
配置使用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://v3ev0217.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
底层原理
docker是做什么工作的?
Docker是一个 Client server的系统,Docker是守护进程运行在主机上。通过socket从客户端访问
DockerServer接受到Docker-Client的指令,就会去执行这个命令。
Docker为什么比虚拟机快
Docker有着比虚拟机更少的抽象层
Docker利用的是主机的内核,vm需要的是Guset OS
所以说新建一个容器的时候,docker不需要想虚拟机一样重新加一个操作系统的内核,避免引导,
虚拟机是加载 Guest OS 分钟级别的,
而docker是利用主机的操作系统,省略了这个复杂的加载过程,秒级别
现在的docker是都支持的
不只支持 linux,Mac OS, windows都支持
之后又docker的使用经验之后我们回过头来再看理论,就会理解的很清晰了
常用命令
Docker imeages #查看所有本地的主机上有的镜像
[root@iZwz90ps06ioyada63oiwiZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 days ago 13.3kB #解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的储存大小 #可选项 -a -all #列出所有的镜像 -q --quiet #只显示镜像的id
Docker pull 下载
#下载内容 ,默认的tag 是 latest #可以按照版本号 ,也可以直接用mysql下载版本 [root@iZwz90ps06ioyada63oiwiZ ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 07aded7c29c6: Already exists #分段的下载,联合文件系统,不用重复下载,可以共用重复的部分 f68b8cbd22de: Already exists 30c1754a28c4: Already exists 1b7cb4d6fe05: Already exists 79a41dc56b9a: Already exists 00a75e3842fb: Already exists b36a6919c217: Already exists 5e11fe494f45: Pull complete 9c7de1f889a7: Pull complete cf6a13d05a76: Pull complete fc5aa81f393a: Pull complete Digest: sha256:360c7488c2b5d112804a74cd272d1070d264eef4812d9a9cc6b8ed68c3546189 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
删除命令
docker rmi -f 9f35042c6a98 #根据 镜像id 删除docker镜像
docker rmi -f images id images id images id #批量删除docker镜像
docker rmi -f $(docker images -aq) # 删除全部镜像
我们有了镜像才可以创建容器,以linux为例子,创造一个CentOS的容器
来测试学习
docker pull centos
新建容器并且启动
docker run [可选参数] image #参数说明 --name = "name" 容器名字, tomcat 1 ,tomcat 2来区分容器 -d 后台的方式运行 -it 使用交互方式运行 ,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip :主机端口:容器端口 -p 主机端口 : 容器端口(常用) -p 容器端口 -p 随机指定端口 #测试,并且启动进入容器 [root@iZwz90ps06ioyada63oiwiZ ~]# docker run -it centos /bin/bash [root@aa1a02ed3f51 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr #推出容器查看 [root@iZwz90ps06ioyada63oiwiZ /]# ls bin dev home lib64 media mynacos nginxWebdata patch project run srv tmp var boot etc lib lost+found mnt myredis opt proc root sbin sys usr www
列出所有运行的容器
docker ps #列出当前正在运行的容器 -a #列出当前正在运行的容器+带出历史运行过的内容 -n = ? #显示最近创建的容器 -q #只显示容器的编号 #可以看到我们之前使用的 helloworld 和 centos 容器 [root@iZwz90ps06ioyada63oiwiZ /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa1a02ed3f51 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago upbeat_matsumoto 0341862ece26 feb5d9fea6a5 "/hello" 8 hours ago Exited (0) 8 hours ago clever_jennings
退出容器
exit #直接容器停止并且推出
Ctrl + p + q #容器不停止 推出
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a|xargs docker rm #也可以删除所有的容器
[root@iZwz90ps06ioyada63oiwiZ /]# docker rm -f $(docker ps -aq)
aa1a02ed3f51
0341862ece26
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #关闭容器
docker kill 容器id #强制关闭当前的容器
后台启动容器
#命令 docker run -d 镜像!
#问题 docker ps 发现centos停止了
#常见的坑 docker 容器使用后台运行,就必须要有一个前台的进程,docker发现没有前台的应用,就会自动停止
#nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
练习 部署 nginx
docker安装nginx
#1, 搜索镜像 search 建议去docker hub 上搜索可以看到详细信息 docker search nginx #2 拉取镜像 pull 下载镜像 docker pull nginx #3 运行测试 #使用参数 #-d 后台运行 # --name 给容器名字 # -p 宿主机端口:容器端口 [root@iZwz90ps06ioyada63oiwiZ ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZwz90ps06ioyada63oiwiZ ~]# docker run -d --name nginx01 -p 3344:80 nginx 30361d53c7276f50adecbef37a56865b9858a0b553efa7f33689c8c9f16d927e [root@iZwz90ps06ioyada63oiwiZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30361d53c727 nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:3344->80/tcp nginx01 [root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344 #测试通过,进入查看配置,之后停止容器 [root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344 <!DOCTYPE html> <html> <head> #成功 <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> [root@iZwz90ps06ioyada63oiwiZ ~]# docker exec -it nginx01 /bin/bash root@30361d53c727:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@30361d53c727:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@30361d53c727:/# cd /etc/nginx root@30361d53c727:/etc/nginx# ls conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params root@30361d53c727:/etc/nginx# exit exit [root@iZwz90ps06ioyada63oiwiZ ~]# ls install.sh [root@iZwz90ps06ioyada63oiwiZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30361d53c727 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp nginx01 [root@iZwz90ps06ioyada63oiwiZ ~]# docker stop 30361d53c727 30361d53c727
端口暴露的概念