Docker与微服务实战(基础篇)

Docker与微服务实战(基础篇)

编码开发微服务

上线部署容器化

时时刻刻要监控

devops

1、Docker简介

1.1.官网

docker官网:https://www.docker.com/

Docker Hub仓库官网:https://hub.docker.com/

Docker hub 安装docker镜像的仓库

Docker中有几个重要的概念:

1.2.镜像和容器

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container) :镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器 呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

1.3.Docker架构

我们要使用Docker来操作镜像、容器,就必须要安装Docker。

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

如图:


2、Docker安装步骤

Docker必须部署在Linux内核的系统上,如果其他系统想部署Docker就必须安装一个Linux环境

2.1.Centos7及以上的版本

uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)

bash 复制代码
[root@192 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@192 ~]# 
[root@192 ~]# uname -r
3.10.0-1160.el7.x86_64

Docker的基本组成:镜像(image)、容器(container)、仓库(repository)

2.2.卸载旧版本

https://docs.docker.com/engine/install/centos/

bash 复制代码
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
bash 复制代码
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

2.3.yum安装gcc相关

bash 复制代码
Centos7能上网

yum -y install gcc

yum -y install gcc-c++

2.4.安装需要的软件包

bash 复制代码
# 国外网址,容易报错,建议不要照着国外安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

报错:
1[Errno 14] curl#35 -TCP connection reset by peer
2 [Errno 12] curl#35 -Timeout

虚拟机联网,安装yum工具

bash 复制代码
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

2.5.设置stable镜像仓库【国内aliyun】

然后更新本地镜像源:

shell 复制代码
# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo


2.6.更新yum软件包索引--以后安装更快捷

bash 复制代码
# 更新yum软件包索引
yum makecache fast

2.7.安装Docker-Ce

然后输入命令:

bash 复制代码
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

或者

shell 复制代码
yum install -y docker-ce

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

2.8.启动Docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

bash 复制代码
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
bash 复制代码
systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

2.9.测试

bash 复制代码
[root@192 docker]# ps -ef | grep docker
root       2001      1  7 13:40 ?        00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       2291   1475  0 13:41 pts/0    00:00:00 grep --color=auto docker
[root@192 docker]# 
[root@192 docker]# docker -v
Docker version 24.0.7, build afdd53b
[root@192 docker]# 
[root@192 docker]# docker version





2.10.卸载


bash 复制代码
# 关闭docker
sudo systemctl stop docker

sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

# 卸载第三方库包
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

2.11.配置阿里云镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

https://promotion.aliyun.com/ntms/act/kubernetes.html


bash 复制代码
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hjisj8si.mirror.aliyuncs.com"]
}
EOF

# 查看文件内容
cat /etc/docker/daemon.json 

sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker

3.Docker常用命令

3.1.帮助启动类命令

bash 复制代码
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help

3.2.【镜像命令】

3.2.1.列出本地主机上的镜像

bash 复制代码
# 列出本地主机上的镜像
docker images
#列出本地所有的镜像(含历史映像层)
docker images -a
# 只显示镜像ID
docker images -q

#只列出N个镜像,默认是25个
docker search --limit
#只列出5个redis镜像
docker search --limit 5 redis

3.2.2.查找镜像

bash 复制代码
# 查找镜像
docker search [POTIONS]镜像名字

3.2.3.下载镜像

bash 复制代码
# 下载镜像
docker pull 镜像名字[:TAG]   {TAG:镜像的标签版本号}
#没有TAG就是最新版本
docker pull 镜像名字
docker pull 镜像名字:latest
docker pull ubuntu
docker pull redis:6.0.8

3.2.4.查看镜像/容器/数据卷所占的空间

bash 复制代码
# 查看镜像/容器/数据卷所占的空间
docker system df

3.2.5.保存镜像

bash 复制代码
# 保存镜像
docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest

3.2.5.加载本地镜像

bash 复制代码
# 加载本地镜像
docker load -i nginx.tar

3.2.6.删除某个镜像

bash 复制代码
#删除某个镜像
docker rmi 某个镜像名字ID
#强制删除某个镜像
docker rmi -f 某个镜像名字ID
#强制删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG
#强制删除多个镜像
docker rmi -f $(docker images -qa)


3.2.7.面试题:谈谈虚悬镜像是什么,怎么删除?

bash 复制代码
仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image

对于这样的虚悬镜像一定要删除。

查看虚悬镜像命令

bash 复制代码
docker images ls -f dangling=true

命令结果:

这种虚悬镜像已经失去了存在价值,可以删除。

删除虚悬镜像命令:

bash 复制代码
docker image prune

3.3.容器命令【演示用ubuntu】

下载一个ubuntu或者Centos镜像演示

3.3.1.拉取镜像

bash 复制代码
#拉取镜像
docker pull centos
docker pull ubuntu

3.3.2.新建+启动容器

bash 复制代码
#新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字"     为容器指定一个名称;
-d : 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i : 以交互模式运行容器,通常与-t同时使用;
-t : 为容器重新分配一个伪输入终端,通常与-i同时使用;也即启动交互式容器(前台有伪终端,等待交互);

3.3.3.启动交互式容器(前台命令行)

bash 复制代码
#启动交互式容器(前台命令行) 
docker run -it ubuntu bash
docker run -it ubuntu /bin/bash
docker run -it --name=myu1 ubuntu bash

3.3.4.列出当前所有正在运行的容器

bash 复制代码
#列出当前所有正在运行的容器
docker ps
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n :显示最近n个创建的容器。
-q :静默模式,只显示容器编号。

3.3.5.退出容器--两种退出方式

bash 复制代码
#退出容器--两种退出方式
exit  run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止

3.3.6.启动已停止运行的容器

bash 复制代码
#启动已停止运行的容器
docker satrt 容器ID或者名字

3.3.7.重启容器

bash 复制代码
#重启容器
docker resatrt 容器ID或者名字

3.3.8.停止容器

bash 复制代码
#停止容器
docker stop 容器ID或者名字

3.3.9.强制停止容器

bash 复制代码
#强制停止容器
docker kill 容器ID或者名字

3.3.10.删除已停止的容器

bash 复制代码
#删除已停止的容器
docker rm 容器ID
docker rm -f 容器ID
#一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm



3.4.下载一个Redis6.0.8镜像演示

3.4.1.启动守护式容器(后台服务器)

bash 复制代码
docker pull redis:6.0.8
#启动守护式容器(后台服务器)
-d : 表示服务后台运行模式
docker run -d 容器名

3.4.2.前台交互式启动【不建议】

bash 复制代码
#前台交互式启动【不建议】
docker run -it redis:6.0.8
#启动后台守护式启动(后台运行)
docker run -d redis:6.0.8

3.4.3.查看容器日志

bash 复制代码
#查看容器日志
docker logs 容器ID

3.4.4.查看容器内运行的进程

bash 复制代码
#查看容器内运行的进程
docker top 容器ID

3.4.5.查看容器内部细节

bash 复制代码
#查看容器内部细节
docker inspect 容器ID

3.4.6.进入正在运行的容器并以命令交互

bash 复制代码
#进入正在运行的容器并以命令交互
docker exec -it 容器ID bashShell
或者重新进入【不建议】:
docker attach 容器ID
attach : 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
exec : 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
推荐大家使用docker exec命令,因为退出容器终端,不会导致容器的停止
bash 复制代码
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
e58709da98ef   redis     "docker-entrypoint.s..."   14 minutes ago   Up 14 minutes   6379/tcp   vigilant_williams
[root@192 soft]# docker exec -it e58709da98ef /bin/bash
root@e58709da98ef:/data# 
root@e58709da98ef:/data# redis-cli -p 6379
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> exit
root@e58709da98ef:/data# exit
exit
[root@192 soft]# 

3.4.7.从容器内拷贝文件到主机上

bash 复制代码
#从容器内拷贝文件到主机上
容器->主机
docker cp 容器ID:容器内路径 目的主机路径
bash 复制代码
[root@192 soft]# docker run -it ubuntu /bin/bash
root@38933ab36249:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@38933ab36249:/# pwd
/
root@38933ab36249:/# cd /tmp
root@38933ab36249:/tmp# touch a2024.txt
root@38933ab36249:/tmp# ll
total 0
drwxrwxrwt. 1 root root 23 Jan  7 10:11 ./
drwxr-xr-x. 1 root root 17 Jan  7 10:08 ../
-rw-r--r--. 1 root root  0 Jan  7 10:11 a2024.txt
root@38933ab36249:/tmp# 
[root@192 soft]# 
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
38933ab36249   ubuntu    "/bin/bash"               3 minutes ago    Up 3 minutes               boring_brahmagupta
e58709da98ef   redis     "docker-entrypoint.s..."   27 minutes ago   Up 27 minutes   6379/tcp   vigilant_williams
[root@192 soft]# docker cp 38933ab36249:/tmp/a2014.txt /app/soft
Error response from daemon: Could not find the file /tmp/a2014.txt in container 38933ab36249
[root@192 soft]# docker cp 38933ab36249:/tmp/a2024.txt /app/soft
Successfully copied 1.54kB to /app/soft
[root@192 soft]# 
[root@192 soft]# ll
总用量 2761172
-rw-r--r--. 1 root root          0 1月   7 18:11 a2024.txt


[root@192 soft]# docker exec -it 38933ab36249 /bin/bash
root@38933ab36249:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@38933ab36249:/# exit
exit
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
38933ab36249   ubuntu    "/bin/bash"               6 minutes ago    Up 6 minutes               boring_brahmagupta
e58709da98ef   redis     "docker-entrypoint.s..."   31 minutes ago   Up 31 minutes   6379/tcp   vigilant_williams
[root@192 soft]# 

3.4.8.导入和导出容器

bash 复制代码
#导入和导出容器
export 导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID > 文件名.tar

import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

cat ubuntu-001.tar | docker import - user/ubuntu:001
bash 复制代码
[root@192 soft]# docker rm -f 38933ab36249
38933ab36249
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
e58709da98ef   redis     "docker-entrypoint.s..."   39 minutes ago   Up 39 minutes   6379/tcp   vigilant_williams
[root@192 soft]# 
[root@192 soft]# cat ubuntu-001.tar | docker import - user/ubuntu:001
sha256:d7ff238c9005c659f4c5819554181bf5c5e56e15c2ad36db66af1acb347423fe
[root@192 soft]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
user/ubuntu   001       d7ff238c9005   15 seconds ago   72.8MB
redis         latest    7614ae9453d1   2 years ago      113MB
ubuntu        latest    ba6acccedd29   2 years ago      72.8MB
redis         6.0.8     16ecd2772934   3 years ago      104MB
[root@192 soft]# docker run -it d7ff238c9005 /bin/bash
root@493bd15c2a4c:/# cd /tmp
root@493bd15c2a4c:/tmp# ll
total 0
drwxrwxrwt. 2 root root 23 Jan  7 10:11 ./
drwxr-xr-x. 1 root root 18 Jan  7 10:26 ../
-rw-r--r--. 1 root root  0 Jan  7 10:11 a2024.txt
root@493bd15c2a4c:/tmp# 
[root@192 soft]# 

3.5.常用命令小结

bash 复制代码
attach  Attach to a running container  #当前shell 下 attach 连接指定运行镜像
build   Build an image from a Dockerfile  #通过Dockerfile定制镜像
commit  Create a new image from a container changes   #提交当前容器为新的镜像
Copy    files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create  Create a new container  #创建一个新的容器,同run,但不启动容器
diff    Inspect changes on a container's filesystem  #查看docker容器变化
events  Get real time events from the server  #从docker服务获取容器实时事件
exec    Run a command in an existing container #在已存在的容器上运行命令
export  Stream the contents of a container as a tar archive #导出容器的内容流作为一个tar归档文件[对应import]
history Show the history of an image #展示一个镜像形成历史
images  List images #列出系统当前镜像
import  Create a new filesystem image from the contents of a tarball #从tar包中的内容创建一个新的文件系统映像[对应expor]
info    Display system-wide information #显示系统相关信息
inspect Return low-level information on a container #查看容器详细信息
kill    Kill a running container  # kill指定docker容器
load    Load an image from a tar archive #从一个tar包中加载一个镜像[对应save]
login   Register or Login to the docker registry server #注册或者登陆一个docker源服务器logout  Log out from a Docker registry server #从当前Docker registry退出
logs    Fetch the logs of a container #输出当前容器日志信息
port    Lookup the public-facing port which is NAT-ed to PRIVATE_PORT #查看映射端口对应的容器内部源端口
pause   Pause all processes within a container  #暂停容器
ps      List containers#列出容器列表
pull    Pull an image or a repository from the docker registry server #从docker镜像源服务器拉取指定镜像或者库镜像
push    Push an image or a repository to the docker registry server #推送指定镜像或者库镜像至docker源服务器
restart Restart a running container #重启运行的容器
rm      Remove one or more containers #移除一个或者多个容器
rmi     Remove one or more images #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run     Run a command in a new container #创建一个新的容器并运行一个命令
save    Save an image to a tar archive #保存一个镜像为一个tar包[对应load]
search  Search for an image on the Docker Hub #在docker hub中搜索镜像
start   Start a stopped containers #启动容器
stop    Stop a running containers #停止容器
tag     Tag an image into a repository #给源中镜像打标签
top     Lookup the running processes of a container #查看容器中运行的进程信息
unpause Unpause a paused container #取消暂停容器
version Show the docker version information #查看docker版本号
wait    Block until a container stops, then print its exit code #截取容器停止时的退出状态值

4.Docker镜像

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

4.1.分层的镜像

以我们的pu为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载>

4.2.UnionFS联合文件系统

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

4.3.Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot fle system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的LinuxUnix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root fle system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, bin, letc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。

4.4.为什么Docker镜像采用这种分层结构呢?

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

4.5.重点理解

Docker镜像层都是只读的,容器层是可写的

当容器启动时一个新的可写层被加载到镜像的顶部。

这一层通常被称作"容器层","容器层"之下的都叫"镜像层"。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作"容器层","容器层"之下的都叫"镜像层"。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

4.6.docker镜像commit操作案例--演示ubuntu安装vim

4.6.1.提交镜像

bash 复制代码
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID要创建的目标镜像名:[标签名]

4.6.2.从Hub上下载ubuntu镜像到本地并成功运行

bash 复制代码
docker pull ubuntu

4.6.3.原始的默认ubuntu镜像是不带着vim命令的

bash 复制代码
[root@192 soft]# docker run -it ubuntu /bin/bash
root@7878b5ae864f:/# 
root@7878b5ae864f:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@7878b5ae864f:/# vim a.txt
bash: vim: command not found

4.6.4.外网连通的情况下,安装vim

bash 复制代码
#先更新我们的包管理工具
apt-get update
# 然后安装我们需要的vim
apt-get install vim


bash 复制代码
root@7878b5ae864f:/# cd /tmp
root@7878b5ae864f:/tmp# vim a.txt
root@7878b5ae864f:/tmp# cat a.txt
this is a docker

4.6.5.安装完成后,commit我们自己的新镜像

docker commit -m="vim cmd add ok" -a="lb" 139727b83d29 itcast/myubuntu:1.1

-a: 指定镜像作者

-m: 自定义的提交描述信息

-139727b83d29: 容器名字,这里也可以用容器ID代替

-itcast/myubuntu:1.1: 指定要创建目标镜像的自定义名字(这里为itcast/myubuntu)和自定义版本(1.1)

bash 复制代码
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
139727b83d29   ubuntu    "/bin/bash"   3 minutes ago   Up 3 minutes             flamboyant_hellman
[root@192 soft]# docker commit -m="vim cmd add ok" -a="ldy" 139727b83d29 itcast/myubuntu:1.1
sha256:1fd9ce6dfd6992d8c7033dccb9d2898e4dc2b99f1babf631db620474e11e2336
[root@192 soft]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
itcast/myubuntu   1.1       1fd9ce6dfd69   58 seconds ago   189MB
ubuntu            latest    ba6acccedd29   2 years ago      72.8MB

4.6.6.启动我们的新镜像并和原来的对比

原来72.8MB 现在189MB

4.7.总结

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

5.本地镜像发布到阿里云

5.1.本地镜像发布到阿里云流程

5.2.镜像的生成方法

bash 复制代码
基于当前容器创建一个新的镜像,新功能增强
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

commit我们自己的新镜像
docker commit -m="vim cmd add ok" -a="lb" 139727b83d29

-a: 提交的镜像作者

-m: 提交的说明文字

5.3.将本地镜像推送到阿里云

阿里云开发者平台:https://promotion.aliyun.com/ntms/act/kubernetes.html

创建仓库镜像:选择控制台,进入容器镜像服务;选择个人实例;命名空间;仓库名称;进入管理界面获得脚本


5.4.将阿里云的镜像下载本地

6.CentOS7安装DockerCompose

6.1.下载

Linux下需要通过命令下载:

sh 复制代码
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件:

上传到/usr/local/bin/目录也可以。

6.2.修改文件权限

修改文件权限:

sh 复制代码
# 修改权限
chmod +x /usr/local/bin/docker-compose

6.3.Base自动补全命令:

sh 复制代码
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

sh 复制代码
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

7.本地镜像发布到私有库--Docker Registry

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

7.1.下载镜像--创建registry容器并开放端口

bash 复制代码
docker pull registry
  • 运行私有库Registry,相当于本地有个私有Docker hub

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:

bash 复制代码
docker run -d \
    --restart=always \
    --name registry	\
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    --privileged=true \
    registry
    
# -p指定端口,一内一外
# -v表示挂载,前者是宿主机,后者是容器
# Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,

在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--prvileged=true命令,扩大容器的权限解决挂载目录没有权限的

问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

7.2.案例演示创建一个新镜像,ubuntu安装ifconfig命令

bash 复制代码
[root@192 soft]# docker run -it ubuntu /bin/bash
root@e65d61ff09d8:/# ifconfig

root@e65d61ff09d8:/# apt-get -y install net-tools

root@e65d61ff09d8:/# ifconfig
bash 复制代码
[root@192 soft]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                       NAMES
e65d61ff09d8   ubuntu         "/bin/bash"               3 minutes ago    Up 3 minutes                                                objective_leakey
daafa6a212e1   registry       "/entrypoint.sh /etc..."   7 minutes ago    Up 7 minutes    0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
98d2c389f54a   1fd9ce6dfd69   "/bin/bash"               26 minutes ago   Up 26 minutes                                               objective_meninsky
[root@192 soft]# 
[root@192 soft]# docker commit -m="ifconfig cmd add" -a="ldy" e65d61ff09d8 ubuntu:1.2
sha256:811d655579989129269df684b6f4f1fcda542f69988de2005e19a9b610bfd050
[root@192 soft]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED         SIZE
ubuntu                                                        1.2       811d65557998   5 seconds ago   122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1   1.1       1fd9ce6dfd69   2 hours ago     189MB
ubuntu                                                        latest    ba6acccedd29   2 years ago     72.8MB

7.3.curl验证私服库上有什么镜像

指令格式如下所示:

bash 复制代码
curl -XGET http://主机映射的网络地址:主机映射网络端口/v2/_catalog

防踩坑:如果记得自己映射的主机Registy网络地址就可以直接输入;如果不记得,可以使用docker ps -a查看私服库Registry的网络映射信息(映射网络地址和映射端口)。

bash 复制代码
[root@192 soft]# curl -XGET http://192.168.229.129:5000/v2/_catalog
{"repositories":[]}
[root@192 registry-ui]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{"repositories":["nginx"]}

可以看到,目前私服库http://192.168.229.129:5000/v2/_catalog没有任何镜像上传过。。。。。。。【空的】

如下图所示,我的本地私有库Registry的网络地址为0.0.0.0,映射端口为5000。

7.4.将新镜像ubuntu;修改符合私服规范的Tag

bash 复制代码
推送镜像到私有镜像服务必须先tag,步骤如下:
重新tag本地镜像,名称前缀为私有仓库的地址:192.168.229.129:5000

docker tag nginx:latest 192.168.229.129:5000/nginx:1.0 
使用命令docker tag 将 tag nginx:latest 这个镜像修改为 192.168.229.129:5000/nginx:1.0 
bash 复制代码
#自己host主机ip地址
按照公式:docker tag  镜像ID或镜像名:Tag Host:Port/Repository:Tag

上面代码的参数含义如下所示:

(1)镜像ID或镜像名:要上传到私有库Registry的镜像ID或名字;

(2)Tag:要上传的镜像版本号;

(3)Host:本地私有库的映射网址(本文为0.0.0.0);

(4)Post:本地私有库的映射端口(本文为5000);

(5)Repository:Tag:上传到私有库Registry后自定义的镜像名字、版本号。

bash 复制代码
[root@192 soft]# docker tag ubuntu:1.2 192.168.229.129:5000/ubuntu:1.2
[root@192 soft]# 
[root@192 soft]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED         SIZE
192.168.229.129:5000/ubuntu                                   1.2       811d65557998   7 minutes ago   122MB
ubuntu                                                        1.2       811d65557998   7 minutes ago   122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1   1.1       1fd9ce6dfd69   2 hours ago     189MB
ubuntu                                                        latest    ba6acccedd29   2 years ago     72.8MB
[root@192 soft]# 

7.5.修改配置文件使之支持http-配置Docker信任地址

安装的docker只支持阿里云镜像加速网址的http连接,为了实现镜像上传到私有库Registry,我们还要配置支持本地安装私有库Registry的http连接

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

bash 复制代码
# 打开要修改的文件
vi /etc/docker/daemon.json
# registry-mirrors配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。
# vim命令添加内容:http://192.168.229.129:8080为自己设置的私服库地址
"insecure-registries":["http://192.168.229.129:8080"]
#上述理由: docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====>修改完后如果不生效.建议重启docker
# 重新加载
systemctl daemon-reload
# 重启docker
systemctl restart docker



7.6.带有图形化界面版本--更改私有库

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

yaml 复制代码
version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=个人私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry
bash 复制代码
[root@192 soft]# mkdir registry-ui
[root@192 soft]# cd registry-ui/
[root@192 registry-ui]# ll
总用量 0
[root@192 registry-ui]# touch docker-compose.yml
[root@192 registry-ui]# vim docker-compose.yml
[root@192 registry-ui]# 
[root@192 registry-ui]# cat docker-compose.yml
version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=个人私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry
[root@192 registry-ui]# ll
总用量 4
-rw-r--r--. 1 root root 322 1月   8 07:27 docker-compose.yml
[root@192 registry-ui]# docker-compose up -d
Creating network "registry-ui_default" with the default driver
Pulling ui (joxit/docker-registry-ui:static)...
static: Pulling from joxit/docker-registry-ui
540db60ca938: Pull complete
197dc8475a23: Pull complete
39ea657007e5: Pull complete
37afbf7d4c3d: Pull complete
0c01f42c3df7: Pull complete
d590d87c9181: Pull complete
3333c94ae44f: Pull complete
33d7cca6fc9f: Pull complete
076b2dd9bdd1: Pull complete
b70198f04ee7: Pull complete
1fb6c5acc953: Pull complete
Digest: sha256:b0657b6be748173583516e411bd71552e54cb7d5dda94964726297ce8774415c
Status: Downloaded newer image for joxit/docker-registry-ui:static
Creating registry-ui_registry_1 ... done
Creating registry-ui_ui_1       ... done
[root@192 registry-ui]# 
[root@192 registry-ui]# 
[root@192 registry-ui]# docker-compose logs -f
Attaching to registry-ui_ui_1, registry-ui_registry_1
ui_1        | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
ui_1        | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
ui_1        | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
ui_1        | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/90-docker-registry-ui.sh
ui_1        | /docker-entrypoint.sh: Configuration complete; ready for start up
registry_1  | time="2024-01-07T23:31:22.196329571Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.196463852Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.200039301Z" level=info msg="Starting upload purge in 12m0s" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.203727763Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.20447663Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 

7.7.push推送到私服库

命令格式为:

bash 复制代码
docker push 符合私服规范的Tag的镜像名称或ID:版本号
bash 复制代码
docker tag nginx:1.0 192.168.229.129:8080/nginx:1.0 
docker push 192.168.229.129:8080/nginx:1.0 
docker tag ubuntu:1.2 192.168.229.129:8080/ubuntu:1.2
docker push 192.168.229.129:8080/ubuntu:1.2

7.8.curl验证私服库上有什么镜像

bash 复制代码
上传私服库完成,在终端输入命令curl -XGET http://192.168.229.129:8080/v2/_catalog查看私服库上是否有推送的镜像
[root@192 soft]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{"repositories":["nginx","ubuntu"]}

7.9.pull到本地并运行

使用docker pull命令从私有库拉取镜像到docker中:

bash 复制代码
docker pull Registry的网络映射:Registry的端口映射/私有库中的镜像名字:版本号
bash 复制代码
docker pull 192.168.229.129:8080/nginx:1.0 

防踩坑:上面的curl指令只显示了私服库上的镜像名字,如为了获得版本号,需要如下指令,需要注意的ubuntu-advanced是要拉取的镜像名字:

bash 复制代码
curl -XGET http://192.168.229.129:8080/v2/nginx/tags/list

8.Docker容器数据卷

将docker容器内的数据保存进宿主机的磁盘中

8.1.运行一个带有容器卷存储功能的实例

bash 复制代码
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录 镜像名

将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。

为了能保存数据在docker中我们使用卷。

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接实时生效,爽
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

8.2.宿主vs容器之间映射添加容器卷

8.2.1.绑定映射目录

bash 复制代码
#读写默认
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录 镜像名
bash 复制代码
docker run -it --name myubt --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash

8.2.2.查看数据卷是否挂载成功

bash 复制代码
docker inspect 容器ID

8.2.3.容器和宿主机之间数据共享

1 docker修改,主机同步获得

2 主机修改,docker同步获得

3 docker容器stop,主机修改,docker容器重启看数据成功同步。

8.3.容器数据卷读写规则映射添加说明

bash 复制代码
# 可读可写
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
bash 复制代码
# 容器实例内部被限制,只能读取不能写
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

ro = read only

此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。

8.4.卷的继承和共享

8.4.1.容器1完成和宿主机的映射

bash 复制代码
docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData --name u1 ubuntu /bin/bash

8.4.2.容器2继承容器1的卷规则

bash 复制代码
 docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
 
 docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu


9.Docker常规安装简介

9.1.总体步骤

搜索镜像

拉取镜像

查看镜像

启动镜像 - 服务端口映射

停止容器

移除容器

9.2.安装Tomcat【新版本webapps已改为webapps.dist】

https://hub.docker.com/

9.2.1.docker hub上面查找tomcat镜像

9.2.2.从docker hub上拉取tomcat镜像到本地

9.2.3.docker images查看是否有拉取到的tomcat

9.2.4.使用tomcat镜像创建容器实例(也叫运行镜像)

bash 复制代码
docker run -it -p 8080:8080 tomcat

-p :小写,主机端口:docker容器端口
-P :大写,随机分配端口
-i :交互
-t :终端
-d :后台

9.2.5.访问猫首页

可能没有映射端口或者没有关闭防火墙

把webapps.dist目录转成webapps

9.2.6.免修改版说明

bash 复制代码
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8


9.3.安装mysql:5.7

9.3.1.简单版

9.3.1.1.查询拉取mysql镜像
bash 复制代码
docker search mysql

# 不加版本号5.7,默认拉取的是最新版
docker pull mysql:5.7

docker images mysql:5.7
9.3.1.2.使用mysql镜像
bash 复制代码
docker run -p 3306:3306 --name mq -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

docker ps

docker exec -it 容器ID /bin/bash

mysql -u root -p
9.3.1.3.建库建表插入数据
9.3.1.4.外部win10连接运行在docker上的Mysql容器实例服务
9.3.1.5.中文字符集问题
bash 复制代码
show variables like 'character%';


bash 复制代码
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

9.3.2.实战版本

9.3.2.1.新建mysql容器实例

bash 复制代码
docker run \
--name mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-d \
mysql:5.7
bash 复制代码
--name : 起名字
--privilege=true : 容器数据卷权限开启
-p : 端口映射
-d : 后台运行

或者

bash 复制代码
docker run \
--name mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

编写hmy.cnf

bash 复制代码
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000

9.3.2.2.新建my.cnf--通过容器卷同步给mysql容器实例

bash 复制代码
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

9.3.2.3.重新启动mysql容器实例再重新进入并查看字符编码

9.3.2.4.再新建库新建表再插入中文测试

bash 复制代码
show databases;

create database db01;
use db01;
create table t1(id int,name varchar(20));
insert into t1 values(1,'zs'),(2,'lisi'),(3,'王五');

select * from t1;

show variables like 'character%';

drop database db01;

9.4.安装redis

9.4.1.下载redis镜像到本地标签为6.0.8

bash 复制代码
docker search redis --limit 5

docker pull redis

docker images redis

9.4.2.入门命令

9.4.3.命令提醒:容器卷记得加入 --privileged=true

9.4.4.在Centos宿主机下新建目录/app/redis

bash 复制代码
mkdir -p /app/redis

9.4.5.将一个redis.conf文件模板拷贝进/app/redis

  • 开启redis验证
bash 复制代码
requirepass 123456
  • 允许redis外地连接,必须注释掉 #bind 127.0.0.1
  • daemonize no 后台启动设置为no
bash 复制代码
将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
  • 开启redis数据持久化appendonly yes可选

9.4.6. /app/redis目录下修改redis.conf文件

默认出厂的原始redis.conf

9.4.7.使用redis6.0.8镜像创建容器(也叫运行镜像)

bash 复制代码
docker run \
--name mr \
--privileged=true \
-p 6379:6379 \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.0.8 \
redis-server /etc/redis/redis.conf

命令说明
docker run \ # 创建并运行docker 容器实例
--name mr \  # 给容器起个名称
--privileged=true \  # Docker会赋予容器几乎与主机相同的权限,即获取宿主机root用户权限
--appendonly yes \ # 开启AOF持久化功能
-v /app/redis/redis.conf:/etc/redis/redis.conf \ #容器卷,宿主机地址:docker容器内部地址  redis配置文件挂载
-v /app/redis/data:/data \  #redis数据文件挂载
--net host \			# 使用宿主机的ip和端口,指定网络类型为host,即与宿主机使用同一网络,默认
-d redis:6.0.8 \  # 后台运行 redis镜像和版本号
redis-server /etc/redis/redis.conf \  #运行容器 并使用配置文件启动容器内的 redis-server
--cluster-enabled yes \ # 是否开启redis集群
--port 6386 \ # redis端口号
# -p 6380:6379 \  #宿主机端口号:容器端口	端口映射
# --requirepass 123456 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置,不然容易中病毒)


9.4.8.测试redis-cli连接上来

9.4.9.请证明docker启动使用了我们自己指定的配置文件


9.4.10.测试redis-cli连接上来第2次

9.5.安装Nginx

9.5.1.基础拉取、下载、运行

bash 复制代码
docker search nginx --limit 5

docker pull nginx

docker run --name mn -p 80:80 -d nginx

# docker run 启动一个镜像
# -d 表示后台允许
# --name mn  表示为当前容器起一个别名
# -p 80:80 表示将本机的80端口映射到nginx镜像的80端口

9.5.2.进入Nginx容器当中

bash 复制代码
进入Nginx容器当中
docker exec -it nginx /bin/bash
命令详解:
# docker exec 在运行的容器中执行命令
# -i 以交互模式运行容器,通常与 -t 同时使用;例如-it
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;例如-it
# nginx 容器名
# /bin/bash 其实就是表示载入容器后运行bash(命令语言解释程序), 因为docker中必须要保持一个进程(运行的程序)的运行,要不然整个容器就会退出,所以说,bash就担任起了docker中运行的那个进程的角色!
#而/bin/bash则是bash在linux下的位置

9.5.3.创建并运行nginx容器的命令解读:

sh 复制代码
docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器
  • --name : 给容器起一个名字,比如叫做mn
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,例如nginx

这里的-p参数,是将容器端口映射到宿主机端口。

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:



endl

相关推荐
诡异森林。26 分钟前
Docker--Docker网络原理
网络·docker·容器
ALex_zry40 分钟前
Docker Macvlan网络配置实战:解决“network already exists“错误
网络·docker·php
IT小辉同学1 小时前
Docker如何更换镜像源提高拉取速度
spring cloud·docker·eureka
matrixlzp2 小时前
K8S Service 原理、案例
云原生·容器·kubernetes
GnixAij3 小时前
Docker SSH端口转发
docker·ssh
angushine3 小时前
让Docker端口映射受Firewall管理而非iptables
运维·docker·容器
玄明Hanko4 小时前
生产环境到底能用Docker部署MySQL吗?
后端·mysql·docker
玄明Hanko4 小时前
Quarkus+Docker最全面完整教程:手把手搞定Java云原生
后端·docker·云原生
SimonLiu0095 小时前
清理HiNas(海纳斯) Docker日志并限制日志大小
java·docker·容器
coder_copy6 小时前
IDEA 2024 使用总结,踩坑
docker·intellij-idea