docker-基础

Docker

卸载旧版本docker

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

 

 

安装

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum list docker-ce --showduplicates | sort -r 列出可供选择的版本

sudo yum install docker-ce docker-ce-cli containerd.io     (默认下载最新的稳定版)

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io 选择版本下载安装

 

卸载docker

sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

 

 

 

 

 

 

镜像加速

编辑新建 vim /etc/docker/daemon.json 加入下面一行代码 镜像加速

mkdir  /etc/docker/

{
"registry-mirrors": ["https://6h6ezoe5.mirror.aliyuncs.com"]
}

 

docker镜像常用命令

docker是怎摸工作的?

docker 是一个C/S结构的系统,docker的守护进程运行在主机上,通过Socket从客户端访问,dockerserver接收到 docker-client的指令,就会执行这个命令

 

 

docker镜像命令

 

docker info #显示docker的系统信息,包括镜像和容器的数量

docker search #搜索镜像

docker search mysql -f=STARS=5000 #可以根据条件搜索 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11700 [OK]

 

 

docker pull mysql 拉去镜像

默认拉取最新版

[root@localhost ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql a10c77af2613: Pull complete b76a7eb51ffd: Pull complete 258223f927e4: Pull complete 2d2c75386df9: Pull complete 63e92e4046c9: Pull complete f5845c731544: Pull complete bd0401123a9b: Pull complete 3ef07ec35f1a: Pull complete c93a31315089: Pull complete 3349ed800d44: Pull complete 6d01857ca4c1: Pull complete 4cc13890eda8: Pull complete Digest: sha256:aeecae58035f3868bf4f00e5fc623630d8b438db9d05f4d8c6538deb14d4c31b Status: Downloaded newer image for mysql:latest #最新版 docker.io/library/mysql:latest #docker pull mysql 相当于 docker pull docker.io/library/mysql:latest [root@localhost ~]#

 

拉取指定版本
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a10c77af2613: Already exists
b76a7eb51ffd: Already exists
258223f927e4: Already exists
2d2c75386df9: Already exists
63e92e4046c9: Already exists
f5845c731544: Already exists
bd0401123a9b: Already exists
2724b2da64fd: Pull complete
d10a7e9e325c: Pull complete
1c5fd9c3683d: Pull complete
2e35f83a12e9: Pull complete
Digest: sha256:7a3a7b7a29e6fbff433c339fc52245435fa2c308586481f2f92ab1df239d6a29
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@localhost ~]#

 

docker image 查看已有镜像

 

[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 8b43c6af2ad0 26 hours ago 448MB mysql latest b05128b000dd 26 hours ago 516MB busybox latest 7138284460ff 6 days ago 1.24MB hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB

 

docker image rm 镜像ID或者镜像名字

docker rmi 镜像ID或者镜像名字 (同上一个用途)

[root@localhost ~]# docker image rm 8b43c6af2ad0Untagged  |  mysql:5.7
Untagged: mysql@sha256:7a3a7b7a29e6fbff433c339fc52245435fa2c308586481f2f92ab1df239d6a29
Deleted: sha256:8b43c6af2ad08d95cdcb415d245446909a6cbc1875604c48c4325972e5b00442
Deleted: sha256:aad43f4d2f66438acd2d156216cd544a728851238714975c38d9a690f68afc57
Deleted: sha256:7b9addbc002c1e828aee7ec5c2679b04a591b6fa2b96002701ddee9d4ed54395
Deleted: sha256:b00f8e4e6ce8920fb563615503f232799ab380b338c3f2cbb5e86a2d762a6e80
Deleted: sha256:8fbabb17fd7b46a59cc15301741bf73a527b862f59cc6e84fae15b4dd5c425c0
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql         latest   b05128b000dd   26 hours ago   516MB
busybox       latest   7138284460ff   6 days ago     1.24MB
hello-world   latest   feb5d9fea6a5   7 weeks ago   13.3kB

 

 

一次性删除所有镜像

[root@localhost ~]# docker rmi -f $(docker images -q)
Untagged: busybox:latest
Untagged: busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353
Deleted: sha256:7138284460ffa3bb6ee087344f5b051468b3f8697e2d1427bac1a20c8d168b14
Untagged: hello-world:latest
Untagged: hello-world@sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

 

 

docker 容器命令

 

 

docker容器常用命令

退出容器

exit #直接容器停止并退出

ctrl +p +q #容器不停止退出

删除容器

docker rm 容器id #删除容器;正在运行的需要加上 -f 选项

docker rm -f $(docker ps -aq) #删除全部容器

docker ps -aq | xargs docker rm -f #删除全部容器

启动和停止容器的操作

docker start 容器id #启动容器

docker restart 容器id #重启容器

docker stop 容器id #停止当前运行的容器

docker kill 容器id #强制停止当前容器

查看日志

docker logs -f -t --tail 10 容器id

--tail 指定查看的条数;-f 监控的查看不退出;-t 显示时间

查看容器中的进程信息

docker top 容器id

查看镜像的元数据

docker inspect 容器id;或者名字

docker inspect 镜像 #也可以查看 镜像的元数据

 

进入当前正在运行的容器

我们通常容器都是使用后台方式运行,需要进入容器,修改一些配置

docker exec -it 容器id /bin/bash # 进入容器会开启一个新的终端,可以在里面操作(常用)

 

docker attach #进入容器正在执行的终端,不会启动新的进程

 

从容器内拷贝文件到宿主机

docker cp aa8426a1b1ec:/home/luoluo #例子

docker cp 容器id:/path/file /path/to/宿主机目录

 

提交修改的镜像

docker commit -a "作者" -m "一些信息" 镜像id 版本

例子

[root@localhost ~]# docker commit -a "luluo" -m "chuanjian" 82a00a96ca79 nginx:443 sha256:f0f49fc22bd775f0589c9be1d138c5be28de7a5641fbe3c2377f6e582a0d2cbe [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 443 f0f49fc22bd7 14 seconds ago 141MB nginx latest ea335eea17ab 40 hours ago 141MB centos 7 eeb6ee3f44bd 2 months ago 204MB

 

双向绑定存储卷

docker run -d --name mysql01 -v /data:/home -e MYSQL_ROOT_PASSWORD=123123 mysql

-v 宿主机路径:docker容器内路径 可以使用多个 -v #指定路径挂载

-v /容器内路径/ #匿名挂载

-v 具名:docker容器内路径 #具名挂载 ,常用

docker volume ls #查看

[root@localhost ~]# docker run -d --name nginx02 -v juming:/home/ -P nginx 920c2a7033ea3294e64ecfd8509e96c57de69088550023c1c17b689b17260bad [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 920c2a7033ea nginx "/docker-entrypoint.…" 3 seconds ago Up 1 second 0.0.0.0:49154->80/tcp, :::49154->80/tcp nginx02 3a752d04da18 nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01 [root@localhost ~]# docker volume ls DRIVER VOLUME NAME local 1ff0e4720c6dac401a4a00dbb02d5c8dd4b74817b86c463c88e3e08eff77425b local 925e6fecc5a90f142c79de3bfa49cd340859e43eaccf4e79518f60d3fc437f86 local 543261dcf60211ee9ab948f79e9ccee1bcf59f60e30fdef4b7e9ee23bd4b80b9 local a93aa2f5c9a97fce3bb87e88a2d9884c94fe82500f961892a96d3c8569336d27 local be88bbc362ffd40bf4c669cdd5164c67b541878d9be94b352a8fc0cea3fa3fe4 local c6704979ced498a6f328ea855a659efb1bf3e5234ea7993edd29868409270414 local cbf39fa289185d8974b5d7e8f050a544fec2f73e68d043fbdb4f4119336bbc77 local ceshi local d4cf28548f3b18a5990abbf1efbcd7421a637b86e12d886342f068245faeb560 local f94756e886328ce9c05b7b84f7ea8820a406b3866cf4f6f1e1625dc94cecd453 local juming local luo [root@localhost ~]#

docker inspect 卷名 #查看路径,一般都是在 /var/lib/docker/volumes/ 下

 

扩展:

#通过 -v 容器内路径, ro rw 改变读写权限

ro readonly #只读 # 只要看到 ro 就说明这个路径只能通过宿主机来操作,容器内部无法操作!

rw readwrite #可读可写 #不写默认就是rw

例子:

[root@localhost ~]# docker run -d --name nginx02 -v juming:/home:ro -P nginx

[root@localhost ~]# docker exec -it nginx02 /bin/sh

image-20211119211150796

 

 

 

 

-e 额外的设置 ,建议去看hub.docker 服务的官方文档启动服务

 

多个mysql实现数据共享

--volumes-from 容器id或者容器名字 #实现多个容器共享数据卷

docker run -d --name mysql01 -P -v /data/etc:/etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6 #第一个数据卷容器

docker run -d --name mysql02 -P --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6

image-20211120120245103

 

 

 

image-20211120120305706

 

 

 

 

 

小练习

docker 安装 nginx

#1.搜索镜像 docker search nginx ,建议取docker.hub 搜索

#2.下载镜像 pull

#3.运行测试

docker run -d --name nginx01 -p 87:80 nginx

-p 宿主机端口:容器内部监听端口

-P 随机指定宿主机映射端口

 

 

Dockerfile

Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本 !

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!所以要尽可能的减少构建行数!

#创建一个 dockerfile 文件,名字可以随机,建议 Dockerfile

通过dockerfile 构建镜像 docker build -t 名字:版本号 . #如果dockerfile名字不是标准的Dockerfile 需要加 -f 指定文件 docker build -f dockerfile文件路径

 

docker history 镜像id 或者 名字 #可以查看镜像构建步骤

[root@localhost ~]# docker history mycentos:0.1 
IMAGE         CREATED         CREATED BY                                     SIZE     COMMENT
9672b60d6fa1   13 minutes ago   /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin…   0B        
c607b246025e   13 minutes ago   /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo…   0B        
3dd73a42e039   13 minutes ago   /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo…   0B        
740671d818a1   13 minutes ago   /bin/sh -c #(nop) EXPOSE 80                   0B        
e96554238b0c   13 minutes ago   /bin/sh -c yum -y install net-tools           144MB    
89d6e620ba25   13 minutes ago   /bin/sh -c yum -y install vim                   199MB    
da0112708a92   14 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local           0B        
82608b0bc116   14 minutes ago   /bin/sh -c #(nop) ENV MYPATH=/usr/local       0B        
e9d670ab3352   14 minutes ago   /bin/sh -c #(nop) MAINTAINER luluo<62737490…   0B        
eeb6ee3f44bd   2 months ago     /bin/sh -c #(nop) CMD ["/bin/bash"]           0B        
<missing>     2 months ago     /bin/sh -c #(nop) LABEL org.label-schema.sc…   0B        
<missing>     2 months ago     /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB    



 

 

登录docker.hub

docker login -uluoxinwei -pangel4239360

docker push 名字:版本号 #推送到远程仓库

打包镜像

docker save 镜像 -o 路径+打包名

导入镜像

docker

load -i mmm.tar

 

 

image-20211120160709259

 

 

 

 

 

DockerFile的指令

FROM #基础镜像;一切从这里开始构建

MAINTAINER #镜像是谁写的;姓名+邮箱

RUN #镜像构建的时候需要运行的命令

ADD #类似COPY,会自动解压

WORKDIR #镜像的工作目录

VOLUME #挂载的目录

EXPOSE #保留端口配置

CMD #指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令

ONBUILD #ONBUILD 它后面跟的是其它指令,比如 RUN, ADD 等,这些指令在当前镜像构建时并不会被执行,只有以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

COPY #类似ADD,将我们文件拷贝到镜像中

ENV #构建的时候设置环境变量

image-20211120140249657

 

 

 

image-20211120140353311

 

 

 

 

 

Docker网络

 

docker0 网桥

ip addr 查看对应关系

点击查看源网页

 

--link 通过/etc/hosts 的方式 映射 docker 容器名 与 IP 做到可以 直接Ping通容器名 单向的,两边都要设置 ,不建议使用了

 

自定义网络

 

查看所有的docker网络

docker network ls

image-20211120230951237

 

 

 

网络模式:

bridge : 桥接 docker (默认,自己创建也使用bridge 模式)

none : 不配置网络

host : 和宿主机共享网络

container : 容器网络连接!(用的少!局限很大)

 

测试:

#我们直接启动的命令不指定网络会有这样一个默认参数 --net bridge,而这个就是我们的 docker0

docker run -d -P --name tomcat01 --net bridge tomcat

 

 

自定义一个网络

--driver bridge

--subnet 192.168.0.0/16

--gateway 192.168.0.1

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet # --driver bridge 可以省略,默认就是bridge

image-20211120233104184

 

 

 

 

 

 

docker network connect 网络名字 容器id或者名字

例子:docker network connect mynet tomcat01

#把不同网段的容器连接打通,就是把 tomcat01 放到了 mynet 网络下 , 一个容器两个 ip 地址

 

 

 

 

 

 

 

 

docker stats监控容器资源消耗

docker stats #默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c。下面是输出的主要内容:

[CONTAINER]:以短格式显示容器的 ID。 [CPU %]:CPU 的使用情况。 [MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。 [MEM %]:以百分比的形式显示内存使用情况。 [NET I/O]:网络 I/O 数据。 [BLOCK I/O]:磁盘 I/O 数据。 [PIDS]:PID 号。

 

 

只返回当前的状态

如果不想持续的监控容器使用资源的情况,可以通过 --no-stream 选项只输出当前的状态:

?

$ docker stats --no-stream

 

这样输出的结果就不会变化了,看起来省劲不少。

 

 

只输出指定的容器

[root@localhost ~]# docker stats --no-stream nginx01 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 82a00a96ca79 nginx01 0.00% 3.918MiB / 972.3MiB 0.40% 1.29kB / 1.27kB 8.96MB / 21.5kB 2

 

 

 

 

 

可视化

portainer

 

 

 

posted @ 2021-12-29 20:18  不用去猜。  阅读(266)  评论(0)    收藏  举报