共计 6249 个字符,预计需要花费 16 分钟才能阅读完成。
一、Docker是什么
Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
二、Docker 安装
1. Centos安装与卸载
手动卸载旧版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
使用官方安装脚本安装
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
2. Windows安装
点击 控制面板 - 程序 - 启用或关闭Windows功能,开启Hyper-V。
进入 docker官网 下载Docker Desktop,双击进行安装
三、Docker 镜像
1. 获取镜像
$ docker pull docker/getting-started
2. 列出镜像列表
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
mysql 5.7.35 8cf625070931 3 weeks ago 448MB
mysql 8.0.26 c60d96bd2b77 3 weeks ago 514MB
docker/getting-started latest 083d7564d904 2 months ago 28MB
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
3. 查找镜像
$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3628 [OK]
-
NAME: 镜像仓库源的名称
-
DESCRIPTION: 镜像的描述
-
OFFICIAL: 是否 docker 官方发布
-
STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
-
AUTOMATED: 自动构建。
4. 删除镜像
$ docker rmi docker/getting-started
四、Docker 容器
1. 启动容器
$ docker run -d -p 80:80 docker/getting-started
参数说明:
- -d:后台运行
- -p:指定暴露端口
可通过 docker run --help 命令查看参数作用
2. 停止容器运行
$ docker stop d6340abacfa7 # 容器ID
3. 查看所有容器
$ docker ps -a
该命令将列出所有运行中的容器和已停止的容器
4. 启动已停止运行的容器
$ docker start d6340abacfa7 # 容器ID
$ docker restart d6340abacfa7 # 容器ID
5. 容器交互
对于可以交互的容器,可以进入到容器内部,进行相关操作。
$ docker pull ubuntu # 拉取ubuntu镜像
$ docker run -it ubuntu /bin/bash # 启动容器并进入容器内部
参数说明:
- -i: 以交互模式运⾏容器,通常与 -t 同时使⽤
- -t:为容器重新分配⼀个伪输⼊终端,通常与 -i 同时使⽤
6. 进入容器
$ docker run -itd ubuntu # 启动容器并以后台方式运行
当容器以参数 -d 进入后台, 此时想要进入容器,可使用 docker attach、docker exec 进入容器,推荐使用 docker exec。
$ docker exec -it 4d2516648ce0 /bin/bash
7. 退出容器内部
比如想退出ubuntu容器内部,使用exit退出。
root@4d2516648ce0:/# exit
8. 删除容器
直接删除报错
$ docker rm 4d2516648ce0
Error response from daemon: You cannot remove a running container 4d2516648ce085a97d147bc3b8beef02e81f6e77c5ea2a012d572104963f4154. Stop the container before attempting removal or force remove
在删除容器之前,需要先停止运行容器
$ docker stop 4d2516648ce0
$ docker rm 4d2516648ce0
五、容器连接
创建一个 python 应用的容器
$ docker run -d -P training/webapp python app.py
a1d62312db4e3041772cf567607ed6a9995bc39f73f8990af0e9c760fd5de775
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1d62312db4e training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:55000->5000/tcp, :::55000->5000/tcp adoring_swartz
1. 网络端口映射
(1)指定端口
两种方式的区别是:
- -P :是容器内部端口随机映射到主机的高端口。
- -p : 是容器内部端口绑定到指定的主机端口。
$ docker run -d -p 5000:5000 training/webapp python app.py
732f30ae05ae03cb7de71dca186a4d667960fbbcf4f417de9c11a6dac41d5228
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
732f30ae05ae training/webapp "python app.py" 6 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp fervent_ride
a1d62312db4e training/webapp "python app.py" 7 minutes ago Up 6 minutes 0.0.0.0:55000->5000/tcp, :::55000->5000/tcp adoring_swartz
(2)指定网络地址
$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
3c10889d00dc140043175745987d169227e6a06d648a9deb641156b6ec4499cc
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c10889d00dc training/webapp "python app.py" 20 seconds ago Up 18 seconds 127.0.0.1:5001->5000/tcp reverent_goldberg
732f30ae05ae training/webapp "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp fervent_ride
a1d62312db4e training/webapp "python app.py" 10 minutes ago Up 9 minutes 0.0.0.0:55000->5000/tcp, :::55000->5000/tcp adoring_swartz
(3)指定 UDP 端口
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
1192a45b607a3c8e364f8227c650ead85fff80fd0edb794a72f1e5a1b16b3114
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1192a45b607a training/webapp "python app.py" 17 seconds ago Up 15 seconds 5000/tcp, 127.0.0.1:5000->5000/udp bold_shaw
3c10889d00dc training/webapp "python app.py" About a minute ago Up About a minute 127.0.0.1:5001->5000/tcp reverent_goldberg
732f30ae05ae training/webapp "python app.py" 4 minutes ago Up 4 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp fervent_ride
a1d62312db4e training/webapp "python app.py" 11 minutes ago Up 11 minutes 0.0.0.0:55000->5000/tcp, :::55000->5000/tcp adoring_swartz
2. Docker 容器互联
(1)创建一个Docker网络
$ docker network create -d bridge test-net
7edbd75ff78c01ad5f5eb7872f7965d57e6cb98a7df80dc7cb47d3dfef179891
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
d2e544c3d9da bridge bridge local
efab27602b34 host host local
b1a535169706 none null local
7edbd75ff78c test-net bridge local
(2)连接容器
运行一个容器并连接到新建的 test-net 网络
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
打开新的终端,再运行一个容器并加入到 test-net 网络
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
(3)测试
当前容器没有ping命令
$ docker exec -it test1 /bin/bash
root@19440cb02ddd:/# ping www.baidu.com
bash: ping: command not found
安装ping命令
apt-get update
apt install iputils-ping
在 test1 容器输入以下命令
root@19440cb02ddd:/# ping test2
PING test2 (172.18.0.3) 56(84) bytes of data.
64 bytes from test2.test-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.124 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.121 ms
同理在 test2 容器也会成功连接到
root@2f15a07298ae:/# ping test1
PING test1 (172.18.0.2) 56(84) bytes of data.
64 bytes from test1.test-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=3 ttl=64 time=0.119 ms
六、仓库管理
1. 注册
在 https://hub.docker.com 免费注册一个 Docker 账号
2. 登陆与退出
$ docker login # 登录
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: hausen1012
Password:
Login Succeeded
$ docker logout # 退出
Removing login credentials for https://index.docker.io/v1/
3. 推送镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest 083d7564d904 2 months ago 28MB
$ docker tag docker/getting-started docker:v1 # 标记本地镜像,将其归入docker仓库
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest 083d7564d904 2 months ago 28MB
docker v1 083d7564d904 2 months ago 28MB
$ docker push docker:v1 # 推送镜像
七、打包镜像
1 克隆 mblog 源码
git clone https://gitee.com/hausen1012/mblog.git
2 打包
mvn clean package
3 Dockerfile
FROM acaiee/alpine-java:cst
WORKDIR /app/mblog
COPY /mblog-latest.jar app.jar
ENV JAVA_OPTS="\
-Xms128m \
-Xmx512m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m"
EXPOSE 8080
ENTRYPOINT java ${JAVA_OPTS} -jar app.jar
4 制作镜像
将 jar 包与 Dockerfile 放在同一目录。
docker build -t hausen1012/unipower-blog .
5 运行
docker run -d \
--name mblog \
-p 80:8080 \
-v /docker/mblog/storage:/app/mblog/storage \
-v /docker/mblog/logs:/app/mblog/logs \
-e DB_HOST="localhost" \
-e DB_PORT="3306" \
-e DB_NAME="mblog" \
-e DB_USER="root" \
-e DB_PWD="123456" \
hausen1012/unipower-blog
提醒:本文发布于603天前,文中所关联的信息可能已发生改变,请知悉!