Linux环境Docker安装与使用教程

VMware介绍

Docker是一个开源应用容器引擎,类似于虚拟机,Go语言编写。可以打包应用依赖到一个可移植的容器中。

可以利用 Docker 的方法来快速交付,测试和部署代码。

Centos Linux安装Docker

直接:

1
yum -y install docker-io

或者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装依赖
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 配置源
yum list docker-ce --showduplicates | sort -r # 查看支持版本
yum install docker-ce-18.06.3.ce # 安装,默认安装目录/var/lib/docker
systemctl start docker # 启动
systemctl enable docker # 开机启动
docker version # 查看版本
docker ps # 查看当前正在运行的容器
docker start/stop id/name # 启动/停止某个容器
docker rm <the-container-id> # 移除容器
docker images # 查看本地镜像
docker ps -a # 查看所有包括停止的容器

curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #下载docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

在编辑好的yml目录中执行启动关闭项目

1
2
docker-compose up
docker-compose down

镜像加速

1
2
3
4
5
6
7
8
9
10
11
12
https://cr.console.aliyun.com # 注册阿里云,选择镜像中心,镜像加速
会有使用说明:
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

卸载重新安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 卸载
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 查看仓库有哪些版本
yum list docker-ce --showduplicates | sort -r
# 安装新版本 sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
yum install docker-ce-20.10.2 docker-ce-cli-20.10.2 containerd.io
# 查看版本
docker -v
sudo systemctl start docker
# 下载官方getting started 编译
docker build -t getting-started .
# 启动
docker run -dp 80:80 getting-started
# curl访问或者浏览器访问
curl http://localhost

错误

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running
Docker未启动,执行命令:service docker start

ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-3cf202aa8f9b -j RETURN: iptables: No chain/target/match by that name.
关闭防火墙需要重启docker,执行命令:service docker restart

tcp 47.107.215.73:443: i/o timeout
可能原因:网络不通,url地址拼写错误

Error parsing reference: "python:alpine AS base" is not a valid repository/tag: invalid reference format
版本兼容问题:升级docker版本

Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect -> [Help 1]
升级docker-maven-plugin到1.0.0版本。docker开启远程API端口

1
2
3
4
5
6
7
vi /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

:wq

service docker restart

在windows系统环境变量中新建DOCKER_HOST值为tcp://{docker_ip}:2375,将这里的{docker_ip},替换为docker所在的centos服务器IP或主机名.

1
2
3
4
5
6
7
#vi /usr/lib/systemd/system/docker.service
# 在ExecStart这一行末尾加上参数 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# 重新加载配置
systemctl daemon-reload
# 启动docker
systemctl restart docker

docker的安装目录

1
2
3
4
5
docker info | grep "Docker Root Dir"
# 或者在详情中查看我的是/var/lib/docker,/var/lib/docker是容器
docker info
# 查看占用空间 driver是overlay2
du -sh /var/lib/docker/overlay2 或者 du -sh * | sort -h

数据Volume

volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中。在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts,tmpfs(一般不用)

1
2
3
4
5
6
7
8
9
10
11
docker volume create test-nginx-vol # 创建
docker volume ls # 查看所有
docker volume inspect test-nginx-vol # 检查当个volume
docker run -d -it --name=test-nginx -p 8100:80 -v test-nginx-vol:/usr/share/nginx/html nginx # -v代表挂载数据卷,这里使用自定数据卷test-nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录),-p 8100:80对外提供8100端口访问,网页访问http://localhost:8100
vi /var/lib/docker/volumes/test-nginx-vol/_data/index.html # 修改该html网页会直接变化或者进入容器
docker exec -it test-nginx /bin/bash # 进入容器
vi /usr/share/nginx/html/index.html # 一样可以修改网页,如果没有vim命令就需要安装

# docker中安装vim命令,直接执行apt-get install vim会出现Unable to locate package vim
apt-get update # 同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引
apt-get install vim

进入containers目录,每一个序列号,都是一个镜像

常用命令

docker ps 查看启动的容器
docker exec -it id(name) /bin/bash 进入容器,如果出错用把/bin/bash改成/bin/sh
docker rmi 镜像id 删除镜像

docker安装MySQL

数据库不适合部署在docker中。

  1. 拉取官方镜像(使用5.7版本)
    1
    2
    docker pull mysql:5.7 # 拉取5.7版本,我们使用5.7版本,容器内目录/var/lib/mysql
    docker pull mysql # 拉取最新版本
  2. 查看镜像
    1
    sudo docker images
  3. 启动方式一,不建立目录映射
    1
    sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    • -name:容器名
    • -e:配置信息
    • -p:端口映射, 主机端口:容器端口
  4. 启动方式二,建立目录映射
    1
    2
    3
    4
    5
    6
    sudo docker run -p 3306:3306 --name mysql \
    -v /usr/local/docker/mysql/conf:/etc/mysql \
    -v /usr/local/docker/mysql/logs:/var/log/mysql \
    -v /usr/local/docker/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
    • -v: 主机目录:容器目录
  5. 查看docker进程
    1
    docker ps
  6. 重启mysql,删除容器,启动出错,重复启动用得上
    1
    2
    docker restart mysql
    docker rm ba7ef3e4ba975474b67c0f9126f07a4d88140e569323a77800aab8624361d67d # 谨慎使用会丢失容器数据
  7. 进入docker
    1
    2
    sudo docker exec -it mysql bash
    mysql -uroot -proot
  8. 查看或者设置外部访问权限
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql>use mysql;
    mysql>grant all privileges on *.* to root@'%' identified by "root"; # 授权访问
    mysql>flush privileges;
    mysql>select host,user from user;
    +-----------+---------------+
    | host | user |
    +-----------+---------------+
    | % | root |
    | localhost | mysql.session |
    | localhost | mysql.sys |
    | localhost | root |
    +-----------+---------------+
    4 rows in set (0.00 sec)
  9. 通过win Navicat等工具尝试访问

docker安装redis

1
2
3
4
5
docker run -itd --name redis-test -p 6379:6379 redis # 第一次启动
docker start redis-test # 后续通过start/stop操作
docker ps
docker # 直接输入docker可以查看操作命令说明
docker inspect redis-test # 查看容器配置信息,可以查看data路径,bin路径

cli

1
2
3
4
5
6
7
8
9
10
11
12
13
redis-cli


select 0 # 选择数据库 默认是0
keys * # 查找匹配的key
get xxx # 查询指定key的value值
set test 1 # 设置
del test # 删除
exists test

sadd myset a # set操作
lpush list_test abc # list操作
lindex list_test 0 # 查询

docker安装ElasticSearch

问题修复

org.elasticsearch.indices.recovery.RecoveryFailedException...Recovery failed from...
简单修复:删除data目录与logs目录

java docker配置

  1. POM文件配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
    <execution>
    <goals>
    <goal>repackage</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    <!-- 跳过单元测试 -->
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
    <skipTests>true</skipTests>
    </configuration>
    </plugin>
    <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
    <imageName>info-tech</imageName>
    <dockerDirectory>${project.basedir}</dockerDirectory><!--Dockerfile文件存放路径-->
    <resources>
    <resource>
    <targetPath>/</targetPath>
    <directory>${project.build.directory}</directory>
    <include>${project.build.finalName}.jar</include>
    </resource>
    </resources>
    </configuration>
    <!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 -->
    </plugin>
    </plugins>
    </build>
  2. 在工程创建Dockerfile,与pom文件同级
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FROM java:8
    EXPOSE 8080

    VOLUME /tmp
    ADD info-tech.jar app.jar
    RUN bash -c 'touch /app.jar'
    ENTRYPOINT ["java","-jar","/app.jar"]
    # 参数说明
    # EXPOSE 指令用于指定容器将要监听的端口,需要配合 docker run -p PORT:EXPORT使用
    # RUN 每条RUN指定将在当前镜像基础上执行指定命令,并提交为新的镜像,通过&&可以把多条语句合并成一条
    # VOLUME 指定默认卷,会在volume目录下面生成随机码文件夹与之对应。然也可以指定/tmp 其效果都是在主机的/var/lib/docker/volumes目录下创建一个临时文件,并链接到容器的链接路径
    # ADD 相当于COPY文件到容器中,info-tech.jar是java工程包的名字不是镜像名字
    # ENTRYPOINT 启动的时候默认执行的命令
  3. 在开发环境增加环境变量DOCKER_HOST=tcp://localhost:2375 连接到目标Docker主机
  4. 开发环境执行mvn clean package docker:build打包到docker服务器
  5. 到docker服务器,启动
    1
    docker run -itd --name info-tech -p 8080:8080 info-tech:latest # --name 指定一个名称
  6. 制作成镜像分享
    1
    2
    3
    docker save -o info-tech.tar info-tech # 镜像打包输出到当前目录
    docker load < /xxx/xx/info-tech.tar # 上传到其他服务器,加载镜像
    docker images # 查看镜像、之后后面可以允许镜像

IDEA打包就行执行最上级工程中的→Lifecycle→package或者install。POM文件需要增加下面的maven插件配置。
还可以java打包成jar包上传至Docker服务器,在Docker服务器创建Dockerfile编写类似上面的脚本。执行 docker build -t info-tech . 然后运行容器docker run -d --name info-tech -p 8083:8083 info-tech

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

如果启动失败docker run -it info-tech可以看到错误信息
docker rm -f container-id强制移除进程 docker rmi image-id
docker内不能通过127.0.0.1访问主机的其他服务

根据容器名称启动之前启动过的容器 docker start info-tech 启动的容器可以统一命名成增加-run后缀比如info-tech-run

docker安装postgres

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
docker run \
-d \
--name postgres \
-p 5432:5432 \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres123456 \
-v ~/docker_data/pgsql/data:/var/lib/postgresql/data \
postgres:11


docker exec -it postgres /bin/bash
psql -U postgres
create database test;

\c test # 切换数据库

SELECT tablename FROM pg_tables
WHERE tablename NOT LIKE 'pg%'
AND tablename NOT LIKE 'sql_%'
ORDER BY tablename; # 查询数据库表

\d alarm # 查看alarm表的表结构

网络

默认桥接模式,启动的时候通过在宿主机上,可以通过iptables -t nat -L -n,查到一条DNAT规则:
DNAT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:8083 to:172.17.0.5:8083

其他

查看docker占用内存

命令docker stats ,docker ps -a找到容器id ps -ef|grep 容器id找到进程id top -p 进程id,或者cat /proc/pid/status 里面的VmRSS

问题

用户使用docker ps 权限问题

执行sudo chmod a+rw /var/run/docker.sock命令

参考