1.安装docker

1.安装需要的安装包

yum install -y yum-utils

2.设置镜像仓库

yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装docker

yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4.启动docker

docker version #查看版本systemctl start docker

5.测试hello-world

docker run hello-world

阿里云镜像加速

2.基本命令

整个流程:
为什么docker更快?

帮助命令

docker version #显示docker版本信息docker info#显示daocker的系统信息docker 命令 --help #帮助命令

镜像命令

1.docker images:-a 列出所有的镜像:-f:-q 只显示镜像的id2.docker search mysql:--filters=STARS=300 #搜索大于3000的3.docker pull 镜像名[tags]:不加tag下载最新版4.docker rmi -f id 删除指定镜像:docker rmi -f $(docker images -aq) 删除全部镜像

分层下载,若有更新,只需要更新需要更新的几层就行;

容器命令

docker run [可选参数] image--name="Name" 容器名称-d后台方式运行-it使用交互式运行-p指定容器端口 -p 8080:8080-p ip:主机端口:容器端口-p 主机端口:容器端口(常用)-p 容器端口容器端口docker ps :列出当前正在运行的容器:-a 正在运行的容器+带出历史运行过的容器:-n=" />常用的其他命令 

后台启动容器

docker run -d centos #后台启动但是docker ps发现没有进程因为没有前台进程,docker就停止了

查看容器中的进程信息

docker run -d centos /bin/bash -c "while true;do echo studydocker;sleep 1;done"查看:docker logs -tf --tail 10 a6d2fae9c98c

查看镜像元数据

docker inspect a6d2fae9c98c

进入当前正在进行的容器

1.docker exec -it 容器id bashshell:进入容器开启一个新的终端2.docker attach 容器id:进入容器正在执行的3.docker cp 容器id:容器内路径 目的主机路径

部署Nginx

1.docker search Nginx2.docker pull Nginx3.docker run -d --name nginx01 -p 3344:80 nginx

利用Docker搭建code-server

1.拉取镜像

docker pull codercom/code-serverdocker images

2.创建挂载目录

# CODE=/home/docker/code# mkdir $CODE && cd $CODE

3.配置文件

# vim $CODE/config.yaml将以下内容填入bind-addr: 127.0.0.1:8080auth: passwordpassword: 123456cert: false

4.启动服务

# docker run -d -u root \ #后台以root身份运行-p 8088:8080 \#端口映射 主机端口:容器端口--name code-server \ #起名字-v $CODE/config.yaml:/root/.config/code-server/config.yaml \ #挂载-v $CODE:/home/code \ #挂载codercom/code-server

部署完成

3.Docker进阶

3.1可视化

portainer:图形化界面管理工具!提供一个后台面供我们操作!不常用,不建议使用很卡!

3.2Docker镜像讲解

docker commit 提交容器成为一个新的副本docker commit -m="提交的信息" -a="作者" 容器id目标镜像:[tag]如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像;相当于vm中的快照

3.3 容器数据卷

docker run -it -v 主机目录:容器目录

实战:同步mysql数据库

3.4 DockerFile

常用指令

FROM 镜像:基础镜像,一切从这里开始构建MAINTAINER :镜像是谁写的,姓名+邮箱WORKDIR /APP :工作目录(没有目录自动创建目录)COPY :将文件拷贝到镜像中RUN :构建镜像的时候需要运行的命令CMD :指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令ADD 可以使用网络源:复制文件,会自动解压VOLUME:设置卷,挂载主机目录EXPOSE :指定对外的端口ONBUILD:当构建一个被继承Dockerfile 这个时候会运行 ONBUILD 的指令。触发指令ENV:构建的时候设置环境变量

构建docker

docker build -f docker文件路径 -t 镜像名:[tag] .docker history 镜像 : 列出本地进行变更的历史

3.5 Docker网络

两个容器之间是看不见对方的,所以镜像打的端口不能通过在docker内部的127.0.0.1:端口,所以两个镜像要互相访问的时候就需要docker网络的存在;
查看当前主机的网卡:

三张网卡,lo是本机回环的地址,eth0是阿里云内网网卡,docker0是docker的网卡,只要安装就有;
再启动一个容器:查看网卡:

又多了一张网卡,主机上多了一张,容器里也有一张对应的网卡,这叫evth-pair技术,成对出现的网卡,一张在主机上,一张在容器里,使得两个不一个网段的ip能ping通;
这样就可以和主机通信,两个镜像容器通信的时候:

这样就共用了一个docker0的网卡;

查看docker ip:docker inspect  | grep IPAddressLinux查看当前的ip:1.ifconfig2.ip addr3.hostname -I


docker network 相关指令

docker network --help#查看命令帮助文档connect Connect a container to a networkcreateCreate a networkdisconnectDisconnect a container from a networkinspect Display detailed information on one or more networkslsList networksprune Remove all unused networksrmRemove one or more networksdocker network create --help#查看create命令帮助文档Options:--attachable Enable manual container attachment--aux-address mapAuxiliary IPv4 or IPv6 addresses used by Network driver (default map[])--config-from string The network from which to copy the configuration--config-onlyCreate a configuration only network-d, --driver stringDriver to manage the Network (default "bridge")--gateway stringsIPv4 or IPv6 Gateway for the master subnet--ingressCreate swarm routing-mesh network--internal Restrict external access to the network--ip-range strings Allocate container ip from a sub-range--ipam-driver string IP Address Management Driver (default "default")--ipam-opt map Set IPAM driver specific options (default map[])--ipv6 Enable IPv6 networking--label list Set metadata on a network-o, --opt mapSet driver specific options (default map[])--scope string Control the network's scope--subnet strings Subnet in CIDR format that represents a network segment

创建一个网络

docker network create --driver=bridge #驱动程序类型--gateway=192.168.137.1#网关--subnet=192.168.137.0/16#子网mynet#网络名称

其他命令
:::tips
1 查看网络的数据源
docker network inspect 网络名称
2 将容器连接到指定的网络
docker network connect 网络名称 容器id
3 断开容器的网络
docker network disconnect 网络名称 容器id
4 删除所有不在乎使用的网络
docker network prune
5 删除一个或者多个网络
docker network rm 网络名称
6 列出网络
docker network ls
7 创建容器是挂载网络
docker run --name 容器名 -p 80:80 -d --network 网络名 镜像名
:::
注意:如果在起容器的时候加载到某指定的网络,则只会有一个ip地址,并不会桥接到docker0网卡;
如果直接起容器,默认的会带参数–network = bridge,是以桥接的模式桥接在docker0网卡上;

案例

创建mynet网络:


centos01创建不指定网络(默认桥接到docker0):

centos02指定mynet网络:

centos03指定mynet网络:

现在让centos01 ping centos02

ping不通的,因为不在一个网段
centos02 ping centos03

centos02 直接使用名称ping centos03

现在我们将centos01加入到网络中:

centos1是有两个ip的,一个是桥接mynet里的,一个是桥接在docker0上的;然后在centos01 ping centos02

然后查看一下mynet网络:

相比于刚建立的时候多了3个容器;

4.docker compose

安装docker compose

1.curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose2.sudo chmod +x /usr/local/bin/docker-compose3 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose4. docker-compose version 或者 dockercompose version


安装成功;
案例:拉起一个flask和redis两个镜像的一个web应用程序;
首先创建一个composetest的文件夹,然后创建一个app.py文件:

import timeimport redisfrom flask import Flaskapp = Flask(__name__)cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

这个app.py中的redis是网络上的一个主机名,就是数据库存在于另一个位置,使用的端口是6379,然后创建一个requiremenst.txt来写入依赖;

flaskredis

然后创建一个Dockerfile文件:

FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]

从py3.7构建镜像,工作目录选择/code,设置flask的系统环境变量,安装依赖,copy 项目,cmd容器默认启动命令;
然后再创建一个docker-compose.yml 的文件:

# yaml 配置version: '3'services:web:build: .ports:- 5000:5000redis:image: redis:alpine

该 Compose 文件定义了两个服务:web 和 redis。

  • web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。

执行命令拉起镜像:docker-compose up
如果以后台方式运行 docker-compose up -d

报错,也不知道哪错了,gpt改了一下感觉跟我的一样,但是粘贴进去就对了,;

这样就正常构建了;