分类 docker 下的文章

我看到过这样的一句话 在创建容器前,我们创建一个数据卷mysql-volume,把它挂载到mysql容器中,实现数据持久化 那么如果不创建, 是否重启mysql容器数据就丢失了, 为此特地测试了停止容器和重新启动容器以及关机后开机重新启动容器, 实际测试是数据没有丢失的, 但是为什么还是需要增加一个新加卷呢, 我想应该是怕容器损坏, 或者需要修改容器的配置, 那么意味着数据可以需要导出来, 而切换挂载的数据卷应该就会方便很多吧

通过构建的mysql2的dockerfile副本执行的容器创建

docker run -itd -p 3306:3306 --name my_mysql2 -e -d mysql2:Dockerfile --character-set-server=utf8mb4 --collation_server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

一条命令实现启动容器并设置字符集, 兼容的加密方式

docker run --name mysql22 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -d mysql --character-set-server=utf8mb4 --default-authentication-plugin=mysql_native_password

数据挂载到本地, 配置文件读取挂载的, 设置好字符集和加密方式

mkdir -vp /data/docker/mysql/data
touch /data/docker/mysql/my.cnf

建议先执行拷贝配置文件
docker run -v /data/docker/mysql/data:/var/lib/mysql --name mysql22 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -d mysql --character-set-server=utf8mb4 --collation_server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
docker exec -it mysql22 /bin/bash
> cp /etc/mysql/my.cnf /var/lib/mysql
> exit
mv /data/docker/mysql/data/my.cnf /data/docker/mysql/my.cnf -y
这时候可以修改这个容器生成的配置文件后, 再删除掉容器
docker stop mysql22 && docker rm mysql22 && docker ps -a

docker run -v /data/docker/mysql/data:/var/lib/mysql -v /data/docker/mysql/my.cnf:/etc/mysql/my.cnf --name mysql_1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -d mysql --character-set-server=utf8mb4 --collation_server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
  • 将一个已存在的容器修改为自启动
docker update --restart=always mysql_1
FlagDescription
no不自动重启容器. (默认value)
on-failure容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always在容器已经stop掉或Docker stoped/restarted的时候才重启容器

先理解下概念

dockerfile用途是用于执行build生成镜像分支, 在依据这个镜像分支去运行多个镜像

下面以mysql举例

1. 拉取mysql镜像
docker pull mysql
2. 查看mysql
docker images |grep mysql
3.查看本地镜像: (参数-a 表示所有)
docker images -a 
  • 先创建一个Dockerfile文件
FROM mysql
EXPOSE 3306
ENV MYSQL_ROOT_PASSWORD 12345
  • 执行build命令
# 注意最后一个.不能少, 这个表示当前路径
[root@localhost mysql]# docker build -t mysql2:Dockerfile .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM mysql
 ---> be0dbf01a0f3
Step 2/3 : EXPOSE 3306
 ---> Running in 8f2ae74e3aae
Removing intermediate container 8f2ae74e3aae
 ---> 2a6324549f86
Step 3/3 : ENV MYSQL_ROOT_PASSWORD 12345
 ---> Running in 1c61b6fd498b
Removing intermediate container 1c61b6fd498b
 ---> ec33c8026d5c
Successfully built ec33c8026d5c
Successfully tagged mysql2:Dockerfile
  • 查询当前镜像, 这个mysql2就是以我们的配置构建的镜像分支
[root@localhost mysql]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
mysql2              Dockerfile          ec33c8026d5c        About a minute ago   541MB
mysql               latest              be0dbf01a0f3        3 weeks ago          541MB
  • 执行容器
docker run -p 3306:3306 --name my_mysql2 -e -d mysql2:Dockerfile --default-authentication-plugin=mysql_native_password

说明: --default-authentication-plugin=mysql_native_password 
这个配置的添加是为了保证启动好的mysql能通过sqlyog访问, 使用使用兼容的加密方式

这个方案并不好, 很傻, 主要是为了帮助理解dockerfile的简单的使用示例用途

列出Docker本地所有镜像

docker images

下载镜像

# 下载ubuntu镜像
docker pull ubuntu
# 下载mysql镜像
docker pull mysql

停止和启动容器服务

[root@localhost ~]# systemctl stop docker
[root@localhost ~]# systemctl start docker

下载并运行 hyperf/hyperf 镜像,并将镜像内的项目目录绑定到宿主机的 /tmp/skeleton 目录

docker run -v /data/code:/data/code -p 80:9501 -it --entrypoint /bin/sh hyperf/hyperf:latest

docker run -v 主机路径:容器里面的路径 -p 主机端口:容器端口 -it --entrypoint /bin/sh (hyperf/hyperf:latest 镜像名:最新版本)

查看运行中的容器

docker ps

查看本地镜像: (参数-a 表示所有)

docker ps -a

进入容器

docker exec -it f54fc094edb2 /bin/bash

当容器中执行exit时自动重启

--restart=always

关闭容器

docker stop id

删除容器

docker rm -f 容器名
  • 通过容器名查询挂载配置信息
docker inspect 容器名| grep Mounts -A 20

➜  ~ docker inspect my_hyperf | grep Mounts -A 20
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/data/docker/code/fhx",
                "Destination": "/data/fhx",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/data/docker/code/wuloves",
                "Destination": "/data/wuloves",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "8898fabf14e8",
            "Domainname": "",

危险命令, 切勿在生产环境使用, 且使用前记得反复核对当前连接且关闭当前和非实验环境的连接

停止所有容器
docker stop $(docker ps -a -q) 
删除所有容器
docker rm $(docker ps -a -q)
删除所有镜像
docker rmi `docker images -a -q`
  • 当容器中没有 /bin/bash 时, 使用直接的 sh 就可以
[root@localhost ~]# docker exec -it etcd1 /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

[root@localhost ~]# docker exec -it etcd1 sh
/ # 

  • 下载docker-ce的repo1
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
  • 安装依赖(这是相比centos7的关键步骤)
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm -y
  • 安装docker-ce
yum install docker-ce -y
  • 启动docker
systemctl start docker
  • 停止docker
systemctl stop docker

centos8 下需要配置防火墙规则, 需要重启防火墙, 否则容器内可能无法访问正常外网

[root@localhost ~]# firewall-cmd --permanent --zone=trusted --change-interface=docker0
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl start firewalld.service

参考链接: https://www.cnblogs.com/zhouhaibing/p/12247547.html

Dockerfile相关资源: https://github.com/laradock/laradock