写点什么

Docker 的安装及日常命令的使用

作者:Geek_982ff5
  • 2022 年 6 月 02 日
  • 本文字数:8880 字

    阅读完需:约 29 分钟

1.Docker 的安装及使用

Docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障。由于docker通过操作系统层和虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟机额外的操作系统开销,提高资料利用率 
Docker初期把lxc二次开发,后来觉得lxc实在不能满足需求,再次开发了libcontainer
Docker的主要目标是“Build,ship,and run any app,anywhere”构建,传输,处处运行,也就是 以此构建,处处运行
Docker容器也是一种软件的打包技术,只要找到进行的地址,下载镜像即可运行
构建:做一个docker镜像 运输:docker pull 运行:启动一个容器 每一个容器,都有自己的文件系统rootfs Docker的主要组成部分是cs架构
复制代码

docker 镜像下载网站

https://hub.docker.com/search?q=&type=image


1.1.docker 的安装

可以使用清华开源镜像网站的软件包进行安装网址:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/


1.下载镜像,yum源 [root@192.168.146.112~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 
2.修改yum源地址 [root@192.168.146.112~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
3.清除yum缓存 [root@192.168.146.112~]# yum makecache fast
4.安装docker,并将docker软件缓存到本地 [root@192.168.146.112~]# vim /etc/yum.conf keepcache=1 #将0改为1 [root@192.168.146.112~]# yum -y install docker-ce --downloadonly --downloaddir=/root
5.启动docker [root@192.168.146.112~]# systemctl start docker [root@192.168.146.112~]# systemctl enable docker
6.查看docker进程和版本 [root@192.168.146.112~]# ps aux | grep docker root 43556 1.8 6.7 578980 66764 ? Ssl 17:52 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 43666 0.0 0.0 112728 972 pts/1 R+ 17:52 0:00 grep --color=auto docke
[root@192.168.146.112~]# docker versionClient: Docker Engine - Community Version: 20.10.7 API version: 1.41 Go version: go1.13.15 Git commit: f0df350 Built: Wed Jun 2 11:58:10 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.7 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: b0f5bc3 Built: Wed Jun 2 11:56:35 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.6 GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d runc: Version: 1.0.0-rc95 GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 docker-init: Version: 0.19.0 GitCommit: de40ad0
复制代码

1.2.运行第一个容器

默认从国外的网站进行获取安装好之后直接访问即可,在制作镜像的时候已经全部配置好了语法格式:docker run 选项 物理机端口:虚拟机端口 容器名称


[root@192.168.146.112~]# docker run -d -p 80:80 nginx Unable to find image 'nginx:latest' locally #本地没有这个镜像,开始下载,我们也可以先从镜像库里面下载docker pull latest: Pulling from library/nginx #开始从镜像库里面下载 b4d181a07f80: Pull complete 66b1c490df3f: Pull complete d0f91ae9b44c: Pull complete baf987068537: Pull complete 6bbc76cbebeb: Pull complete 32b766478bc2: Pull completeDigest: sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9 Status: Downloaded newer image for nginx:latest a9e8cd73690d81f8916e57dddc7f3b22db48f14add2b6ed202b7ac8d18703727 
-d:后台启动 -p:端口映射,服务器的80端口映射成容器的80端口
=====注意看===== 前面的80是映射后面容器的80,也就是说,前面的80是本地容器的端口,后面的80是容器的端口,我们只是把容器的80映射到了本地的80端口
列如:docker run -d -it -p 88:80 centos:latest这个就是本地的88端口就是容器的80端口,如果我们访问的时候就是本地ip+88,但是容器本身的端口还是80
复制代码


2.docker 镜像管理

2.1.搜索镜像

语法格式 docker search 镜像名选镜像的建议:1. 优先考虑官方 1. starts 数量多(使用的人越多)


[root@192.168.146.112~]# docker search tomcat NAME DESCRIPTION STARS OFFICIAL AUTOMATED tomcat Apache Tomcat is an open source implementati… 3070 [OK] tomee Apache TomEE is an all-Apache Java EE certif… 91 [OK] dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 57 [OK] kubeguide/tomcat-app Tomcat image for Chapter 1 30 consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 18 [OK] cloudesire/tomcat Tomcat server, 6/7/8 15 [OK] aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 13 [OK] arm32v7/tomcat Apache Tomcat is an open source implementati… 11 rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 6 [OK] 
NAME:镜像名称,一般镜像名称前面没有/的表示官方OESCRIPTION:镜像描述 STARS:点赞数量 OFFICIAL:是否是官方 AUTOMATEO:是否自动化安装
复制代码

2.2.获取镜像

docker pull 镜像名(push)docker pull 第三方镜像连接


[root@192.168.146.112~]# 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.2
docker pull 镜像:版本如果直接写镜像,那下载的镜像是当前时间最新的版本
复制代码

2.3.镜像加速

1.配置加速器地址,根据自己的环境来配置 [root@192.168.146.112~]# vim /etc/docker/daemon.json {     "registry-mirrors": ["https://registry.docker-cn.com"] } 
2.重载服务 [root@192.168.146.112~]# systemctl restart docker
3.下载一个镜像看下是否加速 [root@192.168.146.112~]# time docker pull httpd:2.4 2.4: Pulling from library/httpd b4d181a07f80: Already exists 4b72f5187e6e: Pull complete 12b2c44d04b2: Pull complete 35c238b46d30: Pull complete 1adcec05f52b: Pull complete Digest: sha256:1fd07d599a519b594b756d2e4e43a72edf7e30542ce646f5eb3328cf3b12341a Status: Downloaded newer image for httpd:2.4 docker.io/library/httpd:2.4
real 2m42.165s user 0m0.024s sys 0m0.105s
复制代码

2.4.查看所有镜像

两种方式 docker image lsdocker images


[root@192.168.146.112~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 bd29370f84ea 6 days ago 138MB nginx latest 4cdc5dd7eaad 8 days ago 133MB tomcat latest 36ef696ea43d 12 days ago 667MB httpd 2.2 e06c3dbbfe23 3 years ago 171MB 
[root@192.168.146.112~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 bd29370f84ea 6 days ago 138MB nginx latest 4cdc5dd7eaad 8 days ago 133MB tomcat latest 36ef696ea43d 12 days ago 667MB httpd 2.2 e06c3dbbfe23 3 years ago 171MB
REPOSITORY:镜像名称 TAG:版本 IMAGE ID:镜像id CREATED:创建时间 SIZE:大小
复制代码

2.5.备份镜像

语法格式 docker save 镜像名:版本 > xxx.tar.gz


[root@192.168.146.112~]# docker save nginx:latest > docker_nginx_latest.tar.gz
复制代码

2.6.删除镜像

语法格式:docker image rm 镜像:版本


[root@192.168.146.112~]# docker image rm nginx:latest Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container a9e8cd73690d is using its referenced image 4cdc5dd7eaad 删除报错表示docker中的nginx开启,需要强制删除 
强制删除 [root@192.168.146.112~]# docker image rm nginx:latest --force Untagged: nginx:latest Untagged: nginx@sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9
复制代码


2.7.恢复镜像

语法格式:docker load -i xxx.tar.gz


[root@192.168.146.112~]# docker load -i docker_nginx_latest.tar.gz Loaded image: nginx:latest 
[root@192.168.146.112~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 bd29370f84ea 6 days ago 138MB nginx latest 4cdc5dd7eaad 8 days ago 133MB tomcat latest 36ef696ea43d 12 days ago 667MB httpd 2.2 e06c3dbbfe23 3 years ago 171MB
启动镜像 [root@192.168.146.112~]# docker run -d -p 81:80 nginx:latest
复制代码

2.8.镜像硬连接

语法格式:docker image tag 原镜像 新镜像


[root@192.168.146.112~]# docker image tag httpd:2.2 http2.2_test [root@192.168.146.112~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 bd29370f84ea 6 days ago 138MB nginx latest 4cdc5dd7eaad 8 days ago 133MB tomcat latest 36ef696ea43d 12 days ago 667MB http2.2_test latest e06c3dbbfe23 3 years ago 171MB httpd 2.2 e06c3dbbfe23 3 years ago 171MB 
删除原来的新的还在 [root@192.168.146.112~]# docker image rm httpd:2.2 Untagged: httpd:2.2 Untagged: httpd@sha256:9784d70c8ea466fabd52b0bc8cde84980324f9612380d22fbad2151df9a430eb
[root@192.168.146.112~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 bd29370f84ea 6 days ago 138MB nginx latest 4cdc5dd7eaad 8 days ago 133MB tomcat latest 36ef696ea43d 12 days ago 667MBhttp2.2_test latest e06c3dbbfe23 3 years ago 171MB
复制代码

3.Docker 容器日常命令

3.1.查看命令帮助信息

语法格式:docker helpdocker 参数 --helpdocker help 参数

3.2.运行一个容器(run)

语法格式:docker run 选项 容器名 CMDdocker run 命令选项可以多次调用例如-p,-p 80:80 -p 22:22 可以用多次详细参数:https://www.cnblogs.com/xiaobaiskill/p/12203575.html注意相同的镜像可以运行多次,并且每次的配置文件,容器地址,容器 id 都是不同的每启动一个容器都会多一块 vethxxx 的网卡


[root@192.168.146.112~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1748c22ce925 nginx:latest "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp nostalgic_agnesi a9e8cd73690d nginx "/docker-entrypoint.…" About an hour ago Up 20 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp magical_kirch
复制代码


后台启动一个容器 [root@192.168.146.112~]# docker run -d -p 90:80 httpd:2.4 5537982a67c7f205a4bde64a56f27f807bc8c8e1635cca00ad8cc9d5337f970e -d表示后台启动 -p表示端口映射 
进入容器里面 [root@192.168.146.112~]# docker run -it centos:latest [root@e3a28309e86c /]# 默认以容器的id作为主机名
指定容器的名称 [root@192.168.146.112~]# docker run -it --name centos8 centos:latest 不进入容器内部运行命令 直接在最后跟上命令即可 [root@192.168.146.112~]# docker run -it centos:latest ps -efUID PID PPID C STIME TTY TIME CMD root 1 0 0 02:52 pts/0 00:00:00 ps -ef
-it分配交互式终端 --name指定容器的名字 ps -ef会覆盖容器的初始命令 docker run==docker crente + docker start
复制代码


3.3.查看容器列表(ps)

只有对镜像进行操作时才会产生容器,默认导入一个镜像是不会产生容器的,所谓的操作比如启动镜像,对镜像进行命令输入等等语法格式:docker ps 参数:-a :显示所有容器-l :显示最近启动的一个容器-q:只打印容器 id


两种方式 第一种 只查看运行中的容器 [root@192.168.146.112~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS P 95335712e3b1 centos:latest "/bin/bash" 4 minutes ago Up 45 seconds e3a28309e86c centos:latest "/bin/bash" 17 minutes ago Up 45 seconds 5fe52595fa1c httpd:2.4 "httpd-foreground" 23 minutes ago Up 46 seconds 8 5537982a67c7 httpd:2.4 "httpd-foreground" 28 minutes ago Up 28 minutes 0 1748c22ce925 nginx:latest "/docker-entrypoint.…" 41 minutes ago Up 41 minutes 0 a9e8cd73690d nginx "/docker-entrypoint.…" 2 hours ago Up 50 minutes 0 
查看所有容器[root@192.168.146.112~]# docker ps -a CONTAINER ID //容器ID IMAGE //镜像名称 OMMAND //运行的命令 CREATED //何时开启的容器 STATUS //多长时间将容器打开 PORTS //端口 NAMES //容器名称
第二种 只查看运行中的容器 [root@192.168.146.112~]# docker container ls
查看所有容器 [root@192.168.146.112~]# docker container ls -a
复制代码

3.4.删除一个或多个容器(rm)

语法格式:**docker container rm 容器名-f :强制删除删除容器操作慎用,当容器删除里面的数据也会随着删除


删除之前先停掉,如果不停,强制删除 [root@192.168.146.112~]# docker container rm thirsty_shtern thirsty_shtern 
删除容器时不光可以对根据容器名删除也可以根据容器id删除 [root@192.168.146.112~]# docker container rm 95335712e3b1 5fe52595fa1c 1748c22ce925 95335712e3b1 5fe52595fa1c 1748c22ce925
批量删除所有容器 先停止所有容器,停止container,这样才能够删除其中的images: [root@192.168.146.112~]# docker stop $(docker ps -a -q) b4082308dddf 5537982a67c7 a9e8cd73690d 或docker ps -q |xargs docker stop
删除所有容器 [root@192.168.146.112~]# docker ps -a -q | xargs docker rm b4082308dddf 5537982a67c7 a9e8cd73690d 或docker rm $(docker ps -a -q)
删除所有镜像docker rmi $(docker images -q)
复制代码

3.5.关闭、杀死、启动、重启容器(start...)

语法格式:docker [start|kill|stop|restart] 容器名称 ordocker container [start|kill|stop|restart] 容器名称


关闭 [root@192.168.146.112~]# docker stop nginx nginx 杀死 [root@192.168.146.112~]# docker kill 35bd0b2ac976 35bd0b2ac976 [root@192.168.146.112~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35bd0b2ac976 nginx:latest "/docker-entrypoint.…" 2 minutes ago Exited (137) 8 seconds ago nginx 杀死的进程在exited()中的值都是非0的值 
启动 [root@192.168.146.112~]# docker start nginx nginx
重启 [root@192.168.146.112~]# docker restart nginxnginx
如果想进入交互式就有-i参数 [root@192.168.146.112~]# docker start -i nginx
复制代码

3.6.容器改名(rename)

语法格式:docker container rename oldname newname


[root@192.168.146.112~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35bd0b2ac976 nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 20 seconds 0.0.0.0:88->80/tcp, :::88->80/tcp nginx 24651af8b70e httpd:2.4 "httpd-foreground" 7 minutes ago Up 7 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp musing_villani 71267eb748cb nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp agitated_liskov 
[root@192.168.146.112~]# docker container rename musing_villani httpd [root@192.168.146.112~]# docker container rename agitated_liskov nginx2 [root@192.168.146.112~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35bd0b2ac976 nginx:latest "/docker-entrypoint.…" 6 minutes ago Up About a minute 0.0.0.0:88->80/tcp, :::88->80/tcp nginx c43f3a6c9909 nginx:latest "/docker-entrypoint.…" 8 minutes ago Exited (127) 8 minutes ago sweet_einstein 24651af8b70e httpd:2.4 "httpd-foreground" 8 minutes ago Up 8 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp httpd 71267eb748cb nginx:latest "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx2
复制代码

3.7.容器与宿主机之间文件互传(cp)

由于容器中很多命令没有安装,因此需要传到宿主机上修改后在传志容器中语法格式:docker container cp 容器 id:文件路径 本地路径 docker container cp 本地路径 容器 id:文件路径


1.查看容器中文件路径 [root@192.168.146.112~]# docker run -it nginx /bin/bash root@51a5df8dd9fb:/# ls /etc/nginx/ conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params 
2.将容器的文件复制到本地 [root@192.168.146.112~]# docker container cp 35bd0b2ac976:/etc/nginx/nginx.conf .
3.将本地文件复制到容器 [root@192.168.146.112~]# ls[root@192.168.146.112~]# docker container cp nginx.conf 35bd0b2ac976:/etc/nginx/nginx.conf
复制代码

3.8.进入容器(exec)

容器肯定是第一次启动后,就不会再动他了,如果每次需要改配置还有 docker run -it 进入的话显然不是很合理,因此我们有二种方式进入容器进入容器的目的:调试、排查


1.attach方式(不太推荐)(始终使用同一个终端) [root@192.168.146.112~]# docker attach 71267eb748cb 不管会有多少人进入容器始终是pts/0的终端,输入的命令是同步的,非常不合理,有人退出则都退出,容器也会随着死亡 
2:exec(分配一个新的终端) 格式:docker exec -it 容器id/容器名称 /bin/bash [root@192.168.146.112~]# docker exec -it 24651af8b70e /bin/bash \\root@24651af8b70e:/usr/local/apache2# \
复制代码

3.9.查看 docker 容器运行过程中产生的日志

[root@192.168.146.112~]# docker logs nginx /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
复制代码

4.小案例-nginx 容器配置 know 站点

1.准备文件和镜像

1.准备好相关文件 [root@192.168.146.112/docker]# ls docker_nginx_latest.tar.gz know.conf docker_tomcat_latest.tar.gz 
2.创建know战斗配置文件 [root@192.168.146.112/docker]# vim know.conf server { listen 80; server_name know.com; location / { root /web/know_system; index index.html; } }
3.导入nginx镜像 [root@192.168.146.112/docker]# docker load -i docker_nginx_latest.tar.gz Loaded image: nginx:latest
4.启动镜像 [root@192.168.146.112/docker]# docker run -d -p 80:80 --name know_nginx nginx ffabd8316b1dd87848c7d2f76de2dbb3f26eaceb2da17b1ad6d2e7a189ce6488
如果遇到这种报错,则需要重启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@192.168.146.112/docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ffabd8316b1d nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp know_nginx 
2.将配置文件传到容器中 [root@192.168.146.112/docker]# docker cp know.conf ffabd8316b1d:/etc/nginx/conf.d/know.conf
将conf.d下面的default.conf改名字,不然待会影响访问 [root@192.168.146.112/docker]# docker exec -it ffabd8316b1d /bin/bash root@ffabd8316b1d:/# cd /etc/nginx/nginx.conf bash: cd: /etc/nginx/nginx.conf: Not a directory root@ffabd8316b1d:/# cd /etc/nginx/conf.d/ root@ffabd8316b1d:/etc/nginx/conf.d# ls default.conf know.conf root@ffabd8316b1d:/etc/nginx/conf.d# mv default.conf default.off
3.创建web目录 [root@192.168.146.112/docker]# docker exec -it ffabd8316b1d /bin/bash root@ffabd8316b1d:/# mkdir /web
4.解压站点 [root@192.168.146.112/docker]# docker exec -it ffabd8316b1d /bin/bash root@ffabd8316b1d:/# cd /web/ root@ffabd8316b1d:/web# ls docker_tomcat_latest.tar.gz root@ffabd8316b1d:/web# tar xf docker_tomcat_latest.tar.gz
5.重启nginx容器[root@192.168.146.112/docker]# docker restart know_nginx know_nginx
6.访问(因为我这里没有web站点,所有随便拿了一个测试,流程都是一样的)
复制代码

5.总结

docker 容器的第一个进程必须一直处于前台运行状态,否则这个容器就会退出


白话说的意思就是,容器里面必须有一个进程,在运行,如果没有的话,长时间容器就是死掉 必须让一个进程一直存在,这样才能把容器夯住
复制代码


发布于: 2022 年 06 月 02 日阅读数: 4
用户头像

Geek_982ff5

关注

还未添加个人签名 2022.06.02 加入

还未添加个人简介

评论

发布
暂无评论
Docker的安装及日常命令的使用_6月月更_Geek_982ff5_InfoQ写作社区