@TOC
1.Docker的安装及使用
Docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障。由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟机额外的操作系统开销,提高资源利用率
Docker初期把lxc二次开发,后来觉得lxc是在不能满足需求,再次开发了libcontainer
Docker的主要目标是“Build,ship,and run any app,angwhere” 构建,传输,处处运行,也就是以此构建,处处运行
docker容器也是一种软件的打包技术,只要是找到进行的地址,下载镜像即可运行
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,都有自己的文件系统rootfs
docker的主要组成部分是cs架构
docker镜像下载网站
1.1.docker的安装
可以使用清华开源镜像网站的软件包进行安装
网址:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
1.下载镜像 [root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 2.修改镜像地址 [root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo 3.清除yum缓存 [root@docker01 ~]# yum makecache fast 4.安装docker,并将docker软件缓存到本地 [root@docker01 ~]# yum -y install docker-ce 5.启动docker [root@docker01 ~]# systemctl start docker 6.查看docker进程和版本 [root@docker01 ~]# ps aux | grep docker root 72846 0.2 3.4 569132 64068 ? Ssl 16:16 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock [root@docker01 ~]# docker version Client: Docker Engine - Community Version: 19.03.11 API version: 1.40 Go version: go1.13.10 Git commit: 42e35e61f3 Built: Mon Jun 1 09:13:48 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.11 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 42e35e61f3 Built: Mon Jun 1 09:12:26 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec36831.2.运行第一个容器
默认从国外的网站进行获取
安装好之后直接访问即可,他们在制作镜像的时候已经全部配置好了
语法格式:
docker run 选项 物理机端口:虚拟机端口 容器名称
[root@docker01 ~]# docker run -d -p 80:80 nginx Unable to find image 'nginx:latest' locally //本地没有这个镜像,可以用docker pull来下载 latest: Pulling from library/nginx //去库里面下载镜像 8559a31e96f4: Pull complete 8d69e59170f7: Pull complete 3f9f1ec1d262: Pull complete d1f5ff4f210d: Pull complete 1e22bfa8652e: Pull complete Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 Status: Downloaded newer image for nginx:latest 3f68380ac4a4f5329b6995fb1b3ee6b41df55716661c7bdd7a574e13abc8d5b1 -d:后台启动 -p:端口映射,服务器的80端口映射成容器的80端口![26385414)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200620163721567.png)]](https://s4.51cto.com/images/blog/202203/03090417_622014116f6161844.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.docker镜像管理
2.1.搜索镜像
语法格式docker search 镜像名
选镜像的建议:1.优先考虑官方2.starts数量多
[root@docker01 ~]# docker search httpd NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 3067 [OK] centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 33 NAME:镜像名称,一般镜像名称前面没有/的表示官方 DESCRIPTION:镜像描述 STARS:点赞数量 OFFICIAL:是否是官方 AUTOMATED:是否自动化安装2.2.获取镜像
docker pull 镜像名(push)
docker pull 第三方镜像连接
[root@docker01 ~]# docker pull httpd:2.2 2.2: Pulling from library/httpd f49cf87b52c1: Pull complete 24b1e09cbcb7: Pull complete 8a4e0d64e915: Pull complete bcbe0eb4ca51: Pull complete 16e370c15d38: Pull complete Digest: sha256:9784d70c8ea466fabd52b0bc8cde84980324f9612380d22fbad2151df9a430eb Status: Downloaded newer image for httpd:2.2 docker.io/library/httpd:2.22.3.镜像加速
1.配置加速器地址 [root@docker01 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } 2.重载服务 [root@docker01 ~]# systemctl restart docker 3.下载一个镜像看看有没有加速 [root@docker01 ~]# time docker pull httpd:2.4 2.4: Pulling from library/httpd 8559a31e96f4: Already exists bd517d441028: Pull complete f67007e59c3c: Pull complete 83c578481926: Pull complete f3cbcb88690d: Pull complete Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51 Status: Downloaded newer image for httpd:2.4 docker.io/library/httpd:2.4 real 0m46.383s user 0m0.037s sys 0m0.038s2.4.查看所有镜像
两种方式
[root@docker01 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2622e6cca7eb 10 days ago 132MB httpd 2.4 ccbcea8a6757 11 days ago 166MB httpd 2.2 e06c3dbbfe23 2 years ago 171MB [root@docker01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2622e6cca7eb 10 days ago 132MB httpd 2.4 ccbcea8a6757 11 days ago 166MB httpd 2.2 e06c3dbbfe23 2 years ago 171MB REPOSITORY:镜像名称 TAG:版本 IMAGE ID:镜像id CREATED:创建时间 SIZE:大小2.5.备份镜像
语法格式:
docker save 镜像名:版本 > xxx.tar.gz
[root@docker01 ~]# docker save nginx:latest > docker_nginx_latest.tar.gz2.6.删除镜像
语法格式:
docker image rm 镜像名:版本
[root@docker01 ~]# docker image rm nginx:latest Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container 3f68380ac4a4 is using its referenced image 2622e6cca7eb 删除报错表示docker中的nginx开启,需要强制删除 [root@docker01 ~]# docker image rm nginx:latest --force Untagged: nginx:latest Untagged: nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 Deleted: sha256:2622e6cca7ebbb6e310743abce3fc47335393e79171b9d76ba9d4f446ce7b1632.7.恢复镜像
语法格式:
docker load -i xxx.tar.gz
[root@docker01 ~]# docker load -i nginx_docker_lastst.tar.gz Loaded image: nginx:latest [root@docker01 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2622e6cca7eb 10 days ago 132MB httpd 2.4 ccbcea8a6757 11 days ago 166MB httpd 2.2 e06c3dbbfe23 2 years ago 171M 启动镜像 [root@docker01 ~]# docker run -d -p 80:80 nginx:latest2.8.镜像硬链接
语法格式:
docker image tag 原镜像 新镜像
[root@docker01 ~]# docker image tag httpd:2.2 http_test [root@docker01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2622e6cca7eb 10 days ago 132MB httpd 2.4 ccbcea8a6757 11 days ago 166MB http_test latest e06c3dbbfe23 2 years ago 171MB httpd 2.2 e06c3dbbfe23 2 years ago 171MB 删除原后新的还在 [root@docker01 ~]# docker image rm httpd:2.2 Untagged: httpd:2.2 Untagged: httpd@sha256:9784d70c8ea466fabd52b0bc8cde84980324f9612380d22fbad2151df9a430eb [root@docker01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2622e6cca7eb 10 days ago 132MB httpd 2.4 ccbcea8a6757 11 days ago 166MB http_test latest e06c3dbbfe23 2 years ago 171MB3.Docker容器日常命令
3.1.查看命令帮助信息
语法格式: docker help docker 参数 --help docker help 参数3.2.运行一个容器(run)
语法格式:
docker run 选项 容器名 CMD
docker run命令选项可以多次调用例如-p,-p 80:80 -p 22:22可以用多次
详细参数:https://www.cnblogs.com/xiaobaiskill/p/12203575.html
注意相同的镜像可以运行多次,并且每次的配置文件、容器地址、容器id都是不同的
每启动一个容器都会多一块veth的网卡
后台启动一个容器 [root@docker01 ~]# docker run -d -p 92:80 httpd:2.4 -d表示后台启动 -p表示端口映射 进入容器里面 [root@docker01 ~]# docker run -it centos:latest [root@f6ffc8f8bc12 /]# 默认以容器的id作为主机名 指定容器的名称 [root@docker01 ~]# docker run -it --name centos8.2 centos:latest 不进入容器内部运行命令 直接在最后跟上命令即可 [root@docker01 ~]# docker run -it centos:latest ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 03:40 pts/0 00:00:00 ps -ef -it分配交互式的终端 --name指定容器的名字 ps -ef会覆盖容器的初始命令 docker run===docker create + docker start如果不指定容器的名称则随机生成一个
3.3.查看容器列表(ps)
只有对镜像进行操作时才会产生容器,默认导入一个镜像是不会产生容器的,所谓的操作比如启动镜像,对镜像进行命令输入等等
语法格式:
docker ps
参数:
-a:显示所有容器
-l:显示最近启动的一个容器
-q:只打印容器id
两种方式 第一种 只查看运行中的容器 [root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 302487e46eda httpd:2.4 "httpd-foreground" 14 minutes ago Up 14 minutes 0.0.0.0:92->80/tcp loving_burnell 8049b1310b2a httpd:2.4 "httpd-foreground" 54 minutes ago Up 54 minutes 0.0.0.0:90->80/tcp elastic_williamson 7ac3d66b2bc2 nginx:latest "/docker-entrypoint.…" 57 minutes ago Up 57 minutes 0.0.0.0:80->80/tcp laughing_gangul 查看所有容器 [root@docker01 ~]# docker ps -a CONTAINER ID //容器ID IMAGE //镜像名称 OMMAND //运行的命令 CREATED //何时开启的容器 STATUS //多长时间将容器打开 PORTS //端口 NAMES //容器名称 第二种 只查看运行中的容器 [root@docker01 ~]# docker container ls 查看所有容器 [root@docker01 ~]# docker container ls -a3.4.删除一个或多个容器(rm)
语法格式:**
docker container rm 容器名
-f:强制删除
删除容器操作慎用,当容器删除里面的数据也会随着删除
[root@docker01 ~]# docker container rm inspiring_goodall sad_haibt intelligent_pasteur condescending_lewin inspiring_goodall sad_haibt intelligent_pasteur condescending_lewin 删除容器时不光可以对根据容器名删除也可以根据容器id进行删除 [root@docker01 ~]# docker container rm 31809b0b3a41 31809b0b3a41 批量删除所有容器 先停止所有容器 [root@docker01 ~]# docker ps -q |xargs docker stop 72b4e5321fa3 302487e46eda 8049b1310b2a 删除所有容器 [root@docker01 ~]# docker ps -a -q |xargs docker rm 72b4e5321fa3 302487e46eda 8049b1310b2a3.5.关闭、杀死、启动、重启容器(start...)
语法格式:
docker [start|kill|stop|restart] 容器名称
or
docker container [start|kill|stop|restart] 容器名称
关闭 [root@docker01 ~]# docker stop nginx nginx 杀死 [root@docker01 ~]# docker kill 72b4e5321fa3 72b4e5321fa3 [root@docker01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72b4e5321fa3 nginx:latest "/docker-entrypoint.…" 3 hours ago Exited (137) 15 seconds ago nginx 杀死的进程在exited()中的值都是非0的值 启动 [root@docker01 ~]# docker start nginx nginx 重启容器 [root@docker01 ~]# docker restart nginx nginx 如果想进入交互式就用-i参数 [root@docker01 ~]# docker start -i 72b4e5321fa33.6.容器改名(rename)
语法格式:
docker container rename oldname newname
[root@docker01 ~]# docker container rename loving_burnell httpd92 [root@docker01 ~]# docker container rename elastic_williamson httpd90 [root@docker01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72b4e5321fa3 nginx:latest "/docker-entrypoint.…" 18 minutes ago Up 39 seconds 0.0.0.0:80->80/tcp nginx 89abef11a967 centos:latest "/bin/bash" 41 minutes ago Exited (0) 7 minutes ago centos8.2 302487e46eda httpd:2.4 "httpd-foreground" 44 minutes ago Up 3 minutes 0.0.0.0:92->80/tcp httpd92 8049b1310b2a httpd:2.4 "httpd-foreground" About an hour ago Up About an hour 0.0.0.0:90->80/tcp httpd903.7.容器与宿主机之间文件互传(cp)
由于容器中很多命令没有安装,因此需要传到宿主机上修改后再传至容器中
语法格式:
docker container cp 容器id:文件路径 本地路径
docker container cp 本地路径 容器id:文件路径
1.查看容器中文件路径 [root@docker01 ~]# docker run -it nginx /bin/bash root@397a2ae54cea:/# ls /etc/nginx/ conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf 2.将容器的文件复制到本地 [root@docker01 ~]# docker container cp 8be3f16f3db0:/etc/nginx/nginx.conf . 3.将本地文件复制到容器 [root@docker01 ~]# docker container cp nginx.conf 8be3f16f3db0:/etc/nginx/nginx.conf3.8.进入容器(exec)
容器肯定是第一次启动后,就不会再动他了,如果每次需要改配置还用docker run -it进入的话显然不是很合理,因此我们有两种方式进入容器
进入容器的目的:调式、排错
第一种attach方式(不太推荐)(始终使用同一个终端) [root@docker01 ~]# docker attach 68e5215ceda5 不管会有多少个人进入容器始终是pts/0的终端,输入的命令是同步的,非常不合理,有人退出则都退出,容器也会随着死亡 第二种exec(分配一个新的终端) 格式:docker exec -it 容器id/容器名称 /bin/bash [root@docker01 ~]# docker exec -it 68e5215ceda5 /bin/bashattach
exec
3.9.查看docker容器运行过程中产生的日志
[root@docker01 centos69_ssh]# docker logs eloquent_pare Changing password for user root. passwd: all authentication tokens updated successfully.4.小案例-nginx容器配置know站点
1)准备文件和镜像
1.准备好相关文件 [root@docker02 ~]# ls docker_know/ know_system.tar.gz nginx_docker_lastst.tar.gz 2.创建know站点配置文件 [root@docker02 docker_know]# cat know.conf server { listen 80; server_name know.com; location / { root /web/know_system; index index.html; } } 3.导入nginx镜像 [root@docker02 docker_know]# docker load -i nginx_docker_lastst.tar.gz 13cb14c2acd3: Loading layer [==================================================>] 72.49MB/72.49MB d4cf327d8ef5: Loading layer [==================================================>] 63.8MB/63.8MB 7c7d7f446182: Loading layer [==================================================>] 3.072kB/3.072kB 9040af41bb66: Loading layer [==================================================>] 4.096kB/4.096kB f978b9ed3f26: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: nginx:latest 4.启动镜像 [root@docker02 docker_know]# docker run -d -p 80:80 --name know_nginx nginx 4ee5a42706503136c3efbacb443331edfa0284b3ed4ec6fdcb22d1671d6b3205 如果遇到这种报错,则需要重启docker即可解决 [root@docker02 docker_know]# docker run -d -p 80:80 --name know_nginx nginx 3ce213c2ed910e299fd6e1207a2fd04677bdd718454fa85ab79460b10a7457ed docker: Error response from daemon: driver failed programming external connectivity on endpoint know_nginx (6d438789fea2b1354a75d41de2154d17e89859cfb16ce30a8e9392abef8c9e53): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)).2)配置nginx
1.查看容器id [root@docker02 docker_know]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ee5a4270650 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp know_nginx 2.将配置文件传到容器中 [root@docker02 docker_know]# docker cp know.conf 4ee5a4270650:/etc/nginx/conf.d/know.conf 将conf.d下面的default.conf改名字,不然待会影响访问 [root@docker02 docker_know]# docker exec -it 4ee5a4270650 /bin/bash root@4ee5a4270650:/# cd /etc/nginx/conf.d/ root@4ee5a4270650:/etc/nginx/conf.d# ls default.conf know.conf root@4ee5a4270650:/etc/nginx/conf.d# mv default.conf default.off 3.创建web目录 [root@docker02 docker_know]# docker exec -it 4ee5a4270650 /bin/bash root@4ee5a4270650:/# mkdir /web/ [root@docker02 docker_know]# docker cp know_system.tar.gz 4ee5a4270650:/web/know.tar.gz 4.解压站点 [root@docker02 docker_know]# docker exec -it 4ee5a4270650 /bin/bash root@4ee5a4270650:/# cd /web/ root@4ee5a4270650:/web# tar xf know.tar.gz root@4ee5a4270650:/web# ls know.tar.gz know_system 5.重启nginx容器 [root@docker02 docker_know]# docker restart know_nginx know_nginx 6.访问5.总结
docker容器的第一个进程必须一直处于前台运行状态,否则这个容器就会推出