Skip to the content.

docker学习和应用

引言

稍微使用了一下docker,有点感慨,为什么我大学的时候没有去了解使用它。

感觉使用docker,就可以瞬间在Linux下写脚本,试命令,比在本机安装一个虚拟机跑linux方便的多。

一年前下载了docker desktop,图形化界面用不好,命令行才是真的好用。

定义

Docker 是一个容器化平台,它包装你所有开发环境依赖成一个整体,像一个容
器。保证项目开发,如开发、测试、发布等各生产环节都可以无缝工作在不同
的平台

Docker 容器:将一个软件包装在一个完整的文件系统中,该文件系统包含运行
所需的一切:代码,运行时,系统工具,系统库等。可以安装在服务器上的任
何东西。

这保证软件总是运行在相同的运行环境,无需考虑基础环境配置的改变。

特点

轻量 :在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。

标准 :Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。

安全 :Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

image

Docker image 是 Docker 容器的源。换言之,Docker images 用于创建 Docker 容器(containers)。

映像(Images)通过 Docker build 命令创建,当 run 映像时,

它启动成一个 容器(container)进程。 做好的映像由于可能非常庞大,常注册存储在诸如 registry.hub.docker.com 这样的公共平台上。

映像常被分层设计,每层可单独成为一个小映像,由多层小映像再构成大映像,这样碎片化的设计为了使映像在互联网上共享时,最小化传输数据需求。

container

Docker containers -- Docker 容器 -- 是包含其所有运行依赖环境,但与其它容器共享操作系统内核的应用,它运行在独立的主机操作系统用户空间进中。

Docker 容器并不紧密依赖特定的基础平台:可运行在任何配置的计算机,任何平台以及任何云平台上

常见问题

常用命令


在容器内运行一个应用程序

docker pull [镜像]:获得镜像,一般不需要这一步,因为若本地无镜像,docker run会自动拉取

docker run [镜像] [执行的命令]:在容器内运行一个应用程序

docker run -i -t [镜像] [执行的命令]:运行交互式的容器,-i 交互式操作,-t 终端

docker run -d [镜像] [执行的命令]:后台运行,-d 后台运行

docker pull ubuntu:15.10
docker run ubuntu:15.10 /bin/echo "Hello world"
docker run -i -t ubuntu:15.10 /bin/bash
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

进入后台状态的容器

docker attach [CONTAINER ID] [执行的命令]:退出会停止容器

docker exec [CONTAINER ID] [执行的命令]:退出不会停止容器,所以一般使用这一种

docker run -itd ubuntu:15.10 /bin/bash
docker exec -it c1264844c099 /bin/bash

查看容器状态

docker ps:查看正在运行的容器

docker ps -a:查看所有的容器,包括停止运行的

docker ps -l:显示最近创建的容器,只有一个容器

docker port [CONTAINER ID]:查看容器的端口

docker top [CONTAINER ID]:查看容器运行的进程

docker inspect [CONTAINER ID]:查看 Docker 的底层信息

docker port [CONTAINER ID] 5000:查看端口绑定的网址

docker ps 
docker ps -a
docker port 3d454c23db0c
docker top 6d809d5785d7
docker inspect 6d809d5785d7
docker port 536406b5056f 5000

改变容器状态

docker stop [CONTAINER ID] docker stop [NAMES]:停止容器
docker start [CONTAINER ID] docker start [NAMES]:启动容器
docker restart [CONTAINER ID] docker restart [NAMES]:重启容器

有点类似supervisor命令

docker stop 98f5aa2579f3
docker start 98f5aa2579f3
docker restart 98f5aa2579f3

查看容器内的标准输出

docker logs [CONTAINER ID] docker logs [NAMES]:查看日志

docker logs -f [CONTAINER ID]:类似tail -f,动态查看日志 xxx logs id 这种查日志的方式,好像很多命令行查日志都是这样。

docker logs 98f5aa2579f3
docker logs clever_almeida

导出和导入容器

docker export [CONTAINER ID] > [本地路径]

cat [本地路径] docker import - [镜像]
docker export 15c4c8e80a5a > hello.tar
cat hello.tar | docker import - hello:test1

删除容器

docker rm -f [CONTAINER ID]:删除容器,可以删除运行的

docker rm:删除容器,必须是停止状态的容器

docker container prune:处理所有处于终止状态的容器

docker rmi -f [IMAGE ID]:删除镜像

docker rm -f 15c4c8e80a5a
docker container prune
docker rmi -f 6fae60ef3446

运行一个web服务器

docker run -d -P training/webapp python app.py:这个是不行的,因为会默认用其他端口

docker run -d -p 5000:5000 training/webapp python app.py: 前面是访问的端口,后面的是docker内部的端口

docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py:可指定绑定的网址

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py:可选择连接的方式为udp

docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

Dockerfile

最近需要构建一个编译springboot项目的镜像,所以先编写这一章

docker使用maven时修改镜像

首先把java和maven搞清楚

maven安装在 /usr/share/maven 目录下,要替换maven的settings文件

docker run -it maven:3.6-jdk-8 /bin/bash

java项目的dockerfile

FROM maven:3.6-jdk-8 AS builder

VOLUME /root/.m2

# Get data producer code and compile it
COPY ./src /opt/data-producer/src
COPY ./pom.xml /opt/data-producer/pom.xml
COPY ./settings.xml /usr/share/maven/conf/settings.xml

WORKDIR /opt/data-producer
RUN mvn clean package -Dmaven.test.skip=true

FROM java:8
EXPOSE 8080
COPY --from=builder /opt/data-producer/target/renren-fast.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]

go项目的dockerfile

FROM golang:1.18 AS builder

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
	GOPROXY="https://goproxy.cn,direct"

WORKDIR /workdir
COPY . .
RUN go build -o clock 

FROM alpine:3.15
COPY --from=builder /workdir/clock clock
CMD ["./clock"]

docker–部署vue项目

前端项目打包

FROM node:12-alpine AS builder

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
	&& apk add --update make python3 g++ && rm -rf /var/cache/apk/*

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

Volume /root/nodejsdocker_alpine/

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf

ADD default.conf /etc/nginx/conf.d/

COPY --from=builder /usr/src/app/dist/ /usr/share/nginx/html/

容器互联

docker run -d -P –name runoob training/webapp python app.py:使用–name给容器命名

docker network create -d bridge test-net:新建网络,-d 参数指定 Docker 网络类型,有 bridge、overlay

docker network -ls:查看网络状态

docker run -d -P --name runoob training/webapp python app.py
docker network create -d bridge test-net

# 运行两个相同网络的容器
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash

# 连接两个容器
docker exec -it test1 /bin/bash
docker exec -it test2 /bin/bash

# 安装ping命令
apt-get update
apt install iputils-ping

# 测试网络是否互通
ping test2
ping test1