docker入门教程

docker是什么?

Docker是一个开放源代码的开放平台软件,用于开发应用、交付(shipping)应用和运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、更能高效地利用服务器。 容器更多的用于表示软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。

docker logo

官方文档

docker doc

apt更新

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

测试

docker --version

添加当前用户

sudo usermod -aG docker $USER

images和container关系

将images视为模具,则container是images生产后再加工的产物

常用命令

docker pull ubuntu:20.04 #拉取一个镜像 

docker images #当前所有镜像

docker image rm ubuntu:20.04 #删除镜像

docker save -o ubuntu_20_04.tar ubuntu:20.04 #将镜像保存为文件

docker load -i ubuntu_20_04.tar #生成镜像 
docker create -it ubunutu_20.04 #利用镜像创建一个容器

docker ps -a #查看所有容器

docker ps #查看启动的容器 

docker start [container] #启动容器

docker restart [container] # 重启

docker stop [container] #关闭

docker run -itd ubuntu:20.04 #创建并启动容器 

docker attach [container] #进入容器(已经启动的容器)

## 挂起容器 ctrl+p ctrl+q (类似于tmux ctrl+b d)

docker exec [container] [command] #在容器中执行命令
 
docker stats #容器状态 

docker rm [container] # 删除容器

docker container prune #删除所有停止的容器

docker cp xxx xxx #移动文件到docker中

docker rename [old] [new] #容器重命名 

docker update [container] --memory 1000M #修改内存限制

#mysql
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

疑问解惑(生成式AI)

docker的镜像一般都是系统的不同版本吗?

不完全是。Docker镜像可以包含不同类型的映像,包括操作系统映像、应用程序映像以及其他组件的映像。

操作系统映像是包含完整操作系统环境的镜像。这些映像通常基于特定操作系统的不同版本,例如Ubuntu、CentOS、Debian等。操作系统映像为容器提供了必要的操作系统组件和库,使其能够在容器内运行。

应用程序映像是包含特定应用程序和其依赖的镜像。这些映像通常基于特定版本的编程语言或应用程序框架,例如Node.js、Python、Ruby等。应用程序映像使得可以在不同环境中轻松部署和运行特定的应用程序。

此外,还有其他类型的映像,例如数据库映像、Web服务器映像等,用于特定的用途和场景。

总而言之,Docker镜像可以是包含不同版本的操作系统映像,也可以是包含特定应用程序或组件的映像。根据需要,可以选择适合的镜像来构建和部署容器。

容器不能访问原本系统中的mysql?需要在容器中重新安装?

在默认情况下,Docker容器是与宿主系统隔离的,容器内部无法直接访问宿主系统上的服务或资源,包括宿主系统中运行的MySQL数据库

容器的端口号一定要有映射这一步?不映射的话永远的访问不到?

是的,如果你希望从宿主系统或其他网络中访问容器内的应用程序,通常需要进行端口映射。

Docker容器内的应用程序运行在容器的网络命名空间中,与宿主系统和其他容器隔离。默认情况下,容器内的应用程序无法直接通过宿主系统的IP地址或其他网络地址访问。

通过端口映射,你可以将容器内的端口映射到宿主系统上的一个端口,从而使得容器内的应用程序可以通过宿主系统的IP地址和映射的端口进行访问。这样,宿主系统和其他网络中的客户端可以通过宿主系统的IP地址和映射的端口与容器内的应用程序进行通信。

如果你不进行端口映射,容器内的应用程序仍然可以在容器内部相互通信,但无法直接通过外部网络访问。这意味着你无法从宿主系统或其他网络中访问容器内的应用程序。

因此,如果你希望从外部网络中访问容器内的应用程序,你需要进行端口映射。这样,你可以通过宿主系统的IP地址和映射的端口来访问容器内的应用程序。

如何对端口进行映射

要对端口进行映射,你可以在运行 Docker 容器时使用 -p 或 --publish 参数。这个参数的语法是 host-port:container-port,其中 是宿主系统上的端口号,而 是容器内部的端口号。

例如 建议上网搜
docker run -d --name my-container -p 8888:8080 -p 9999:9090 my-image:tag

目前踩到的坑

  • docker可以使模块化,更易于各个技术栈的伸缩,我一开始直接新建ubuntu,然后将前后端数据库扔进去,实际上和直接部署没有什么区别。
  • docker在建立容器时就要设置端口(建立后也可以,但复杂)。一定程度上也呼应了模块化的思想,即我知道这个容器是干什么的,而不是走一步看一步。

docker入门教程
https://dreamerland.cn/2023/09/13/服务器技术杂项/docker/
作者
Silva31
发布于
2023年9月13日
许可协议