docker全部知识持续更新

尊重劳动成果,转载请复制源地址链接,谢谢

负一.有用的网址

1.中文的docker相关文档:https://docker_practice.gitee.io/zh-cn/
2.待更新

零.安装docker

0.docker 官网安装docker地址:https://docs.docker.com/engine/install/centos/
yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
 rm -rf /etc/systemd/system/docker.service.d && rm -rf /var/lib/docker && rm -rf /var/run/docker

sudo yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
sudo yum -y install docker-ce docker-ce-cli containerd.io

1.设置docker 拉取镜像的国内镜像源

vi /etc/docker/daemon.json

{
    "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://registry.aliyuncs.com",   "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn" ],
 "log-driver":"json-file",
 "data-root":"自选位置"
  "log-opts": {"max-size":"5m", "max-file":"3"}
}

备注:清理docker 容器日志的shell文件,额外提一点,编写shell文件时要使用:set ff看看文件是什么格式,如果是doc,就改成set ff=unix

#!/bin/sh 
echo "======== start clean docker containers logs ========"  

logs=$(find /var/lib/docker/containers/ -name *-json.log)  

for log in $logs  
        do  
                echo "clean logs : $log"  
                cat /dev/null > $log  
        done  

echo "======== end clean docker containers logs ========"

2.设置容器内使用apt-get 安装东西慢,主要是有时候需要使用vim

 a:进入容器后 看一下debian的版本(可不需要)

        cat /etc/debian_version
 b:然后备份一下:
        cp  /etc/apt/sources.list  /etc/apt/sources.list_copy
 c.然后运行 
        sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
        如果不是root权限 就去掉sudo
 d.然后apt-get update 一下,然后就老快了

一、镜像

1、所搜镜像

docker search xxxx

a.带用户名前缀的是其他开发者上传的
b.可以使用 -s N 参数指定仅显示评价为N星以上的镜像

2、拉取镜像
docker pull xxxx [:tag]
3.删除镜像
docker rmi xxx[ : tag]

不建议添加 -f 参数,因为如果该镜像已经创建了至少一个容器的话,
强制删除,可能会有残留

4.创建镜像
docker commit [options] container [xxxx [: tag] ]
options:

  --m:提交信息
  --a:作者信息

例如:
docker commit -a:bigShuaiBee -m:woNewBee mysql testMySql
5.上传镜像
[ docker tag 镜像名 新镜像名 ]
ocker push name[:tag]
例:第4中testMySql这个镜像不够吊炸天,我想换个名字然后再上传,就可以这样
docker tag testMySql:latest fuckYourDog:latest
名字改完后上传:
docker push fuckYourDog:latest

push前的名字一般都是使用  自己的名字/镜像原名称:
版本的格式,上边的fuckYourDog其实不太好,所以我最后改成了
fd/nginx:latest

二、容器

1.创建并启动容器
docker create xxxx[:tag]
这种方式就别用了
代替的使用:
docker run -it -d --name=alias xxx[:tag] /bin/bash
‘’run" 他的作用是创建一个容器并且start这个容器,-t 是创建一个伪终端 输入状态,-i 是保持输入,-d是守护运行(daemon),如果不使用-d就会直接进入创建的终端里。
可以使用ctrl+d,或者输入exit可以退出来,但是响应的这个容器就会关闭。

另外可以使用
docker run  --rm xxxxxxxxx
意思是容器终止后立即删除,但是不能和-d一起用

例如:
docker run --name=fuckyou -it -d nginx bash
注意:这里我把/bin/bash 换成了bash,也是可以的
2.删除容器
docker rm [-f] xxx
这个xxx可以是容器的名字或者id都可以
3.终止容器
docker stop xxx
4.进入容器
docker exec -it fuckyou bash
5.容器的导出
docker export fuckyou > /home/fd/fuckshe.tar.gz
导出之后可以在/home/fd/下找到这个tar包,传到其他linux系统上,然后作为镜像使用,如6
6.镜像的导入
docker import 文件的路径 镜像名(其实就是之前的容器名fuckyou)
例:
docker import /home/fd/fuckshe.tar fuckyou
然后使用docker images 就可以看到一个镜像叫fuckyou

但是这种将容器打成镜像的方式是会丢失元数据的,所以已经小,
如果是使用commit+push的方式就会保存所有的元数据

7.查看容器
已经启动的:docker ps
全部 :docker ps -a

三、仓库

1.docker hub 登录
重要说明:创建容器时 后方加了/bin/bash 或者bash时表示只运行bash
应用,并没有运行其他应用
没有账号的话就去docker hub上注册一个,然后回到linux系统中
输入docker login,然后输入账号密码就行

2.docker pool
http://dockerpool.com国内专业docker技术社区
3.创建和使用私有仓库
拉镜像:docker pull registry
创建容器:docker run -it -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

***遇到瓶颈了,没实现成功,先跳过***

四、数据卷

在这里插入图片描述

1.容器和宿主机之间文件的复制
docker cp 宿主机 容器名或者id : 容器的文件路径
比如:
把宿主机中的html文件目录拷贝到容器名称nginx-test-01的/usr/share/nginx中,如果容器目录下有这个html文件目录了,则会默认替换
docker cp /home/fd/nginx/html nginx-test-01 /usr/share/nginx/
反之将容器的东东拷贝到宿主机中也是一样的

2.创建数据卷(本地-容器)

首先看一段命令:
docker run -itd --name nginx-01  \
 -v /home/fd/nginx/html:/usr/share/nginx/html:ro  \
 -p 80:80 \
  nginx
  -v 指的是挂载数据卷,这种是从挂载一个本地目录到容器中去
  作为数据卷
     /home/fd/nginx/html :宿主机的文件目录或文件
     /usr/share/nginx/html :容器的文件目录或文件
     :ro 这个“:ro”代表只读,但是我实际上把这个去掉了。
     创建该容器后,容器内该目录或文件就会被宿主中这个目录或
     文件代替,也就是说 如果不创建数据卷的情况,nginx会再容
     器的这个目录会文件下创建两个文件:50和index.html,如果
     宿主机中没有这两个文件,则上述语句执行后容器内的这两个
     文件也没有了。所以我是先创建了一个linux容器,使用cp命令
     拷贝了一下,然后删除这个临时的容器,在使用上述命令。

3.创建数据卷容器(容器-容器)

先看一段命令
docker run -itd --name nginx-02 \
 -p 8080:80 \
  --volumes-from nginx-01 \
   nginx
 其中 --volumes-from 就是另一个挂载方式,后边的nginx-01
 代表需要提供数据卷的容器,这样 nginx-01和nginx-02就共享
 同一个数据卷,即:宿主机中 /home/fd/nginx/html文件目录,
 可以验证一下,进入宿主机中修改 index.html文件
 然后再主机中使用ip:port的方式查看,
 http://192.168.127.129:8080.

另外:删除了所有使用该数据卷的容器后,数据卷仍然存在的。

五、网络基础配置

1.设置端口

-p 宿主机端口:容器内端口,例:映射一下tomcat容器的8080端口到宿主机的8080端口
另外,我的linux系统上安了mysql使用的是默认的3306,我有一个容器的端口也是3306,每次我启动容器时都启动失败,因为我宿主机上的8080端口已经被占用了,所以我是用ps -ef 或者-aux | grep mysql
找到进程id,然后使用kill 进程id 就可以把宿主机上mysql关了。

如果觉得指定具体的端口号费劲,又怕端口冲突,只可以使用-P,注意刚才的小写,这个是大写,这个大屁 可以随机端口,然后使用下方的查看端口就可以用了

-p 8080:8080

2.查看端口
docker port nginx-01
在这里插入图片描述

3.容器互联实现容器间通讯
之所以加粗了,我认为这部分我掌握的不好

–link name:alias ,其中name 为要链接的容器的名称,alias是这个连接的别名
docker run -d -P --name nginx-03 --link nginx-01:nginx-1-and-3 nginx

六、Dockerfile创建镜像

终于来到了这部分了。很遗憾,我在这篇文章里没怎么写dockerfile

注意啊,dockerfile的名称就叫dockerfile不能叫别的名字

FROM centos
#RUN yum install -y vim
#RUN ["yum","install","-y","vim"]
RUN ["/bin/bash","-c","yum install -y vim"]

七、安装和配置SSH服务

1

apt-get install openssh-server -y
2.
在这里插入图片描述

在这里插入图片描述

八、安装mysql、挂载配置文件、修改端口、dockerfile生成镜像,后续子篇更新主从复制、读写分离

mysql的配置文件:
名为 mysql.cnf
内容如下:

[mysqld]
port=3307
federated
max_connections = 200
max_allowed_packet = 64M
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#限制mysql内存占用
#performance_schema_max_table_instances=400
#table_definition_cache=400
#table_open_cache=256

character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysql.server]
default-character-set=utf8

[mysqld_safe]
default-character-set=utf8


先拉取的mysql 5.7的镜像
docker pull mysql:5.7
因为已经在mysql.cnf 中指定了端口号,所以创建容器时开放的端口为3338
docker run -itd -p 3338:3338 -e MYSQL_ROOT_PASSWORD=root -v /home/fd/wyc/mysql/conf.d:/etc/mysql/conf.d -v /home/fd/wyc/mysql/data:/var/lib/mysql -v /home/fd/wyc/mysql/log:/var/log/mysql --name mysql01 mysql:5.7

进入mysql :mysql -uroot -proot
然后执行 sql:source xxxx.sql

以上的方式过于闹心
所以要改进一下,使用dockerfile和docker-compose的方式来实现,其实在将docker-compose的那章讲了。这里只是简单贴出来一下哈。
dockerfile:

FROM mysql:5.7
ENV MYSQLDUMPDIR /mysql
EXPOSE 3339
RUN  mkdir -p $MYSQLDUMPDIR && mkdir /home/mysql

docker-compose.yml

version: "3.2"
services:
  mysql:
#    networks:
#      - wyc
    build:
      context: ./
      dockerfile: ./dockerfile
    restart: always
    image: wyc_mysql
    container_name: wyc_mysql_01
    ports:
      - "3307:3307"
    volumes:
      - "/home/fd/wycplus/mysql/conf.d/:/etc/mysql/conf.d/"
      - "/home/fd/wycplus/mysql/data/:/var/lib/mysql/"
      - "/home/fd/wycplus/mysql/log/:/var/log/mysql/"
      - "/home/fd/wycplus/mysql/init.d/:/docker-entrypoint-initdb.d/"
    environment:
#      - MYSQL_USER= 'root'
#      - MYSQL_PASS= 'root'
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOSE: '%'
      MYSQL_DATABASE: wyc_test
      TZ: Asia/Shanghai

九、tomcat,使用dockerfile的方式创建镜像、创建容器

弊端:

a.需要先在宿主的挂载目录下修改端口号
b.mysql的地址是写在war包中
c.宿主与tomcat容器映射的webapps目录是的配置文件和war包是拷贝进去的

1.先启动一个tomcat容器,然后把conf、logs、使用docker cp 拷贝出来,在conf中的server.xml中将端口改成8077,因为我的项目端口是8077.
2.编写dockerfile
在这里插入图片描述:wq
dockerfile的同级目录下分别我项目自己使用的ini文件和war包
在这里插入图片描述
3.创建镜像
docker build -t wyc_tomcat . 注意:最后有一个点
4.启动镜像我这里要挂载

挂载了两个个东西,分别是配置文件、log日志
docker run -itd  -v /home/fd/wyc/tomcat/conf/:/usr/local/tomcat/conf/  \
-v  /home/fd/wyc/tomcat/logs/:/usr/local/tomcat/logs/  \
-p 8077:8077 \
--name wyc01 \
--privileged=true \wyc_tomcat

但是这样的话,容器的webapps文件目录就没有被挂载,之后替换war包时就很麻烦。
所以我把dockerfile中的两个add去掉,将宿主机中的webapp中添加config.ini和war包。
如下

docker file:

FROM tomcat:8.5.40
EXPOSE 8077
#ADD rideHailing.war  /usr/local/tomcat/webapps/
#ADD config.ini  /usr/local/tomcat/webapps/
VOLUME ["/usr/local/tomcat/webapps"]
WORKDIR /usr/local/tomcat/webapps

宿主机该tomcat的挂载目录webapp下是:
在这里插入图片描述
然后生成镜像、创建容器就可以了。
这次生成容器使用如下,挂载日志、配置、工程目录

docker run -itd -v /home/fd/wyc/tomcat/conf/:/usr/local/tomcat/conf -v /home/fd/wyc/tomcat/logs/:/usr/local/tomcat/logs -v /home/fd/wyc/tomcat/webapp/:/usr/local/tomcat/webapps -p 8077:8077 --name wyc01 --privileged=true   wyc_tomcat

十、redis,使用dockerfile的方式创建镜像、创建容器

dockerfile

 FROM redis
EXPOSE 6379
WORKDIR /redis

ENV CONF /redis/conf
ENV DATA /reids/data
ENV LOGS /redis/logs

#RUN mkdir -p $CONF &&  mkdir -p $DATA && mkdir -p $LOGS

VOLUME ["$CONF","$DATA"]

然后使用docker-compose.yml来启动,在docker-compose.yml文章中有提到,请看另一个篇文章
如果你不想使用docker-compose
就想用dockerfile创建镜像,然后创建容器、启动容器
那就:
docker build -t redis_image . (注意 最后要有个 空格加一个点)
这样镜像生成完成了
然后创建容器吧

docker run -idt --name fuckredis -p 6379:6379 \
      -v /home/fd/wycplus/redis/conf:/redis/conf \
      -v /home/fd/wycplus/redis/data:/redis/data \
      -v /home/fd/wycplus/redis/logs:/redis/logs \
      --privileged=true \
      reids_image redis-server conf/redis.conf 

这样容器就创建完了
想进容器就
docker exec -it fuckredis bash,就进去了
然后使用redis-cli客户端操作查看redis
redis-cli -p 6379(端口)
然后就使用redis的那些命令就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值