一篇文章详细讲解Docker容器

发布时间:2023年12月21日

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

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

阿里云镜像加速
image.png

2.基本命令

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

帮助命令

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

进入当前正在进行的容器

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.启动服务

# 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网络的存在;
查看当前主机的网卡:
image.png
三张网卡,lo是本机回环的地址,eth0是阿里云内网网卡,docker0是docker的网卡,只要安装就有;
再启动一个容器:查看网卡:
image.png
又多了一张网卡,主机上多了一张,容器里也有一张对应的网卡,这叫evth-pair技术,成对出现的网卡,一张在主机上,一张在容器里,使得两个不一个网段的ip能ping通;
image.png 这样就可以和主机通信,两个镜像容器通信的时候:
image.png
这样就共用了一个docker0的网卡;
image.png

查看docker ip:
	docker inspect <container_id> | grep IPAddress
Linux查看当前的ip:
	1.ifconfig
  2.ip addr
  3.hostname -I

image.png
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网络:
image.png
image.png
centos01创建不指定网络(默认桥接到docker0):
image.png
centos02指定mynet网络:
image.png
centos03指定mynet网络:
image.png
现在让centos01 ping centos02
image.png
ping不通的,因为不在一个网段
centos02 ping centos03
image.png
centos02 直接使用名称ping centos03
image.png
现在我们将centos01加入到网络中:
image.png
centos1是有两个ip的,一个是桥接mynet里的,一个是桥接在docker0上的;然后在centos01 ping centos02
image.png
然后查看一下mynet网络:
image.png
相比于刚建立的时候多了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

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

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来写入依赖;

flask
redis

然后创建一个Dockerfile文件:

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 的文件:

# 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
image.png
报错,也不知道哪错了,gpt改了一下感觉跟我的一样,但是粘贴进去就对了,😓;
image.png
这样就正常构建了;

文章来源:https://blog.csdn.net/nobugnomoney/article/details/135140702
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。