一篇文章详细讲解Docker容器

1.安装docker

1.安装需要的安装包

复制代码
yum install -y yum-utils

2.设置镜像仓库

复制代码
yum-config-manager  --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装docker

shell 复制代码
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 只显示镜像的id
2.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=? 显示最近创建的容器
	:-q 只显示容器的编号
exit 直接退出容器
ctrl +p+q 容器不停止退出
docker  rm 容器id  (不能删除正在运行的容器)
	:docker  rm -f $(docker ps -aq)
docker start 容器id 
docker restart 容器id 
docker stop 容器id 
docker kill 容器id

常用的其他命令

后台启动容器

复制代码
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

进入当前正在进行的容器

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

部署Nginx

复制代码
1.docker search Nginx
2.docker pull Nginx
3.docker run -d --name nginx01 -p 3344:80 nginx

利用Docker搭建code-server

1.拉取镜像

复制代码
docker pull codercom/code-server
docker images

2.创建挂载目录

复制代码
# CODE=/home/docker/code
# mkdir $CODE && cd $CODE

3.配置文件

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

4.启动服务

shell 复制代码
# 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 <container_id> | grep IPAddress
Linux查看当前的ip:
	1.ifconfig
  2.ip addr
  3.hostname -I

docker network 相关指令

复制代码
docker network --help                          #查看命令帮助文档
	connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

docker network create --help                  #查看create命令帮助文档
	Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create 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 map              Set 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-compose
2.sudo chmod +x /usr/local/bin/docker-compose
3 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. docker-compose version 或者 dockercompose version

安装成功;

案例:拉起一个flask和redis两个镜像的一个web应用程序;

首先创建一个composetest的文件夹,然后创建一个app.py文件:

python 复制代码
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.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来写入依赖;

python 复制代码
flask
redis

然后创建一个Dockerfile文件:

python 复制代码
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

从py3.7构建镜像,工作目录选择/code,设置flask的系统环境变量,安装依赖,copy 项目,cmd容器默认启动命令;

然后再创建一个docker-compose.yml 的文件:

python 复制代码
# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
      - 5000:5000
  redis:
    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改了一下感觉跟我的一样,但是粘贴进去就对了,😓;

这样就正常构建了;

相关推荐
三劫散仙19 分钟前
kubernetes jenkins pipeline优化拉取大仓库性能指定分支+深度
容器·kubernetes·jenkins
西京刀客23 分钟前
k8s热更新-subPath 不支持热更新
云原生·容器·kubernetes·configmap·subpath
高冷的肌肉码喽23 分钟前
Linux-进程间的通信
linux·运维·服务器
乖乖是干饭王27 分钟前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
jekc86834 分钟前
禅道18.2集成LDAP
linux·运维·服务器
weixin_4349362841 分钟前
k8S 命令
linux·容器·kubernetes
weixin_307779131 小时前
Linux下GCC和C++实现统计Clickhouse数据仓库指定表中各字段的空值、空字符串或零值比例
linux·运维·c++·数据仓库·clickhouse
Tender_光2 小时前
iptables实验
运维·服务器
szxinmai主板定制专家3 小时前
【飞腾AI加固服务器】全国产化飞腾+昇腾310+PCIe Switch的AI大模型服务器解决方案
运维·服务器·arm开发·人工智能·fpga开发
点击查询3 小时前
怎么把自己电脑设置成服务器?
运维·服务器