Docker學(xué)習(xí)筆記

Docker基本操作

Docker環(huán)境配置
安裝docker

參考http://www.itdecent.cn/p/b7c9cfb06ea4

設(shè)置鏡像源

/etc/docker/daemon.json

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
啟動(dòng)docker
sudo systemctl start docker
設(shè)置開機(jī)自啟
sudo systemctl enable docker
測(cè)試
docker run hello-world
Docker中央倉庫
  1. Docker官方倉庫,鏡像最全,國內(nèi)下載較慢

https://hub.docker.com/

  1. 國內(nèi)鏡像,如網(wǎng)易云、DaoCloud(推薦)

https://c.163yun.com/hub#/home

http://hub.daocloud.io/

  1. 在公司內(nèi)部可以自行搭建中央倉庫

自行搭建中央倉庫方法

/etc/docker/daemon.json

{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries": ["ip:port"]
}

最后需要重新啟動(dòng)下服務(wù)

sudo systemctl daemon-reload
sudo systemctl restart docker
鏡像操作
拉取鏡像到本地
# 命令
docker pull 鏡像名[:tag]

# 例如
docker pull daocloud.io/library/tomcat:8.5.15-jre8
查看全部本地鏡像
docker images
刪除本地鏡像
docker rmi 鏡像的標(biāo)志
# 這里 b8 是鏡像的 id 開頭幾個(gè)字母
docker rmi b8 
刪除無用鏡像
docker image prune

加上-a參數(shù)后,會(huì)刪除所有沒有被容器引用的鏡像

鏡像的導(dǎo)入導(dǎo)出
# 將本地的鏡像導(dǎo)出
docker save -o 導(dǎo)出的路徑 鏡像id
# 例如
docker save -o ./tomcat.image b8

# 加載本地的鏡像文件(名稱和版本為none,可以用下面的命令更改名字)
docker load -i 鏡像文件
# 例如
docker load -i ./tomcat.image

# 鏡像重命名
docker tag 鏡像id 新名字:版本
# 例如
docker tag b8 tomcat:8.5
容器的操作
運(yùn)行容器
docker run 鏡像id|鏡像名稱[:tag]
常用參數(shù)
docker run -d -p 宿主機(jī)端口:容器端口 --name 容器名稱 鏡像id|鏡像名稱[:tag]
# 例如
docker run -d -p 8081:8080 --name tomcat b8
  • -d 后臺(tái)運(yùn)行容器
  • -p 宿主機(jī)端口:容器端口 Linux端口和容器端口之間的映射
  • --name 容器名稱 指定容器名稱
查看運(yùn)行中的容器
docker ps [-qa]
  • -a 查看所有容器,包括沒有運(yùn)行的容器

  • -q 只查看運(yùn)行中容器的標(biāo)志

  • -qa 查看所有容器的標(biāo)志

  • 無參數(shù) 查看運(yùn)行中的容器

查看日志
docker logs -f 容器id
  • -f 動(dòng)態(tài)查看日志的最后幾行
進(jìn)入容器內(nèi)部
docker exec -it 容器id bash
# 退出
exit
刪除容器
# 停止指定容器
docker stop 容器id
# 停止所有容器
docker stop $(docker ps -qa)
# 刪除指定容器
docker rm 容器id
# 刪除全部容器
docker rm $(docker ps -qa)
啟動(dòng)容器
docker start 容器id

Docker應(yīng)用

mysql
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=my_secret daocloud.io/library/mysql:5.7.4
  • -e 指定 mysql 密碼
tomcat
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
部署項(xiàng)目

以部署Jenkins為例,下載地址http://updates.jenkins-ci.org/download/war/2.263/jenkins.war

# 將宿主機(jī)內(nèi)容復(fù)制到容器
docker cp 文件名 容器id:容器內(nèi)部路徑
# 例如
docker cp jenkins.war db4914a734a2:/usr/local/tomcat/webapps/ 

訪問ip:8080/jenkins,可以看到j(luò)enkins已經(jīng)安裝好了,使用docker logs -f db4914a734a2 命令可以查看安裝細(xì)節(jié)。

數(shù)據(jù)卷

將宿主機(jī)中的一個(gè)目錄映射到容器的一個(gè)目錄中,當(dāng)宿主機(jī)目錄發(fā)生變化時(shí),容器中的目錄也會(huì)跟著變化。數(shù)據(jù)卷實(shí)現(xiàn)了在容器外操作容器內(nèi)的目錄和文件

創(chuàng)建數(shù)據(jù)卷
# 創(chuàng)建數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名稱
# 默認(rèn)數(shù)據(jù)卷位置是 /var/lib/docker/volumes/數(shù)據(jù)卷名稱/_data
# 例如
docker volume create tomcat
查看數(shù)據(jù)卷詳情
docker volume inspect 數(shù)據(jù)卷名稱
# 例如
docker volume inspect tomcat
查看全部數(shù)據(jù)卷
docker volume ls
刪除數(shù)據(jù)卷
docker volume rm 數(shù)據(jù)卷名稱
# 例如
docker volume rm tomcat
刪除無主數(shù)據(jù)卷
docker volume prune
應(yīng)用數(shù)據(jù)卷

方式一:映射前創(chuàng)建數(shù)據(jù)卷

docker run -v 數(shù)據(jù)卷名稱:容器內(nèi)部路徑 鏡像id

# 創(chuàng)建數(shù)據(jù)卷
docker volume create volume_tomcat
# 將數(shù)據(jù)卷映射到容器內(nèi)部目錄
docker run -d -p 8080:8080 --name tomcat -v volume_tomcat:/usr/local/tomcat/webapps/ daocloud.io/library/tomcat:8.5.15-jre8
# 將項(xiàng)目復(fù)制到數(shù)據(jù)卷中
sudo cp jenkins.war /var/lib/docker/volumes/volume_tomcat/_data

采用create方式創(chuàng)建的數(shù)據(jù)卷的掛載目錄是/var/lib/docker/volumes/數(shù)據(jù)卷名稱/_data。所以上面的-v volume_tomcat:/usr/local/tomcat/webapps/-v /var/lib/docker/volumes/volume_tomcat/_data:/usr/local/tomcat/webapps/是等價(jià)的。

方式二:指定數(shù)據(jù)卷目錄(推薦)

docker run -v 路徑:容器內(nèi)部路徑 鏡像id

# 將指定目錄數(shù)據(jù)卷映射到容器內(nèi)部目錄
docker run -d -p 8080:8080 --name tomcat -v /opt/volume_tomcat:/usr/local/tomcat/webapps/ daocloud.io/library/tomcat:8.5.15-jre8
# 將項(xiàng)目復(fù)制到數(shù)據(jù)卷中
sudo cp jenkins.war /opt/volume_tomcat

兩種方式區(qū)別:第一種方式會(huì)在默認(rèn)目錄創(chuàng)建數(shù)據(jù)卷,而且容器中的內(nèi)容也會(huì)拷貝到該目錄中,第二種方式只在指定位置創(chuàng)建數(shù)據(jù)卷,但容器中內(nèi)容不會(huì)自動(dòng)拷貝進(jìn)來

查看數(shù)據(jù)卷掛載位置
docker inspect 容器id | grep Mounts -A 20

Docker自定義鏡像

創(chuàng)建Dockerfile
  • FROM 指定當(dāng)前自定義鏡像依賴的環(huán)境
  • COPY 將相對(duì)路徑下的內(nèi)容復(fù)制到自定義鏡像中
  • WORKDIR 聲明鏡像的默認(rèn)工作目錄
  • ENV 配置環(huán)境變量
  • RUN 創(chuàng)建當(dāng)前的 Docker 鏡像,每次調(diào)用該指令的時(shí)候,Docker 都會(huì)創(chuàng)建新的鏡像層。RUN 后面直接跟 shell 指令
  • CMD 需要執(zhí)行的命令,在工作目錄(workdir)下執(zhí)行,可以寫多個(gè),只以最后一個(gè)為準(zhǔn)
  • MAINTAINER 鏡像維護(hù)者信息
  • EXPOSE 暴露端口

Dockerfile

FROM alpine:3.8

RUN apk add --no-cache \
    ca-certificates \
    git \
    gcc \
    musl-dev \
    openssl \
    go

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
ENV APIPATH $GOPATH/src/api
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" "$APIPATH" && chmod -R 777 "$GOPATH"

WORKDIR $APIPATH
COPY . .

RUN \
    go get -d -v \
    && go install -v \
    && go build

EXPOSE 3000
CMD ["./api"]
制作鏡像
docker build -t 鏡像名:[tag] 目錄名
docker build -f Dockerfile -t 鏡像名:[tag] 目錄名
# 例如
docker build -t jenkins-tomcat:1.0.0 .
# 運(yùn)行自定義鏡像
docker run -d -p 8080:8080 --name jenkins-tomcat a75b8a0e7da6
dockerignore

在構(gòu)建鏡像過程中,為了提高構(gòu)建性能,可以通過.dockerignore文件排除上下文目錄下不需要的文件和目錄

.dockerignore

.DS_Store
node_modules
/dist
dist

Dockerfile
.dockerignore

# git
.git
.gitignore

# local env files
.env.local
.env.*.local

.env.production
.env

server/public

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
發(fā)布鏡像

構(gòu)建鏡像

docker build -t your_dockerhub_username/your_image_name .

構(gòu)建完成后,可以使用docker images命令檢查剛才構(gòu)建的鏡像

登錄docker

docker login -u your_dockerhub_username 

命令執(zhí)行會(huì)要求輸入密碼,登錄成功后會(huì)在~/.docker/config.json存儲(chǔ)用戶登錄信息

推送鏡像

docker push your_dockerhub_username/your_image_name

取回鏡像

docker pull your_dockerhub_username/your_image_name

Docker-Compose

之前運(yùn)行一個(gè)容器,需要在命令行添加大量參數(shù),這樣不方便記憶和管理,Docker-Compose可以用文件方式編寫這些參數(shù),而且它還可以批量管理容器

安裝Docker-Compose

參考 http://www.itdecent.cn/p/b7c9cfb06ea4

docker-compose.yml

docker-compose.yml文件以key: value來指定配置信息,多個(gè)配置信息以換行+縮進(jìn)方式區(qū)分。鍵和值之間有一個(gè)空格,縮進(jìn)用兩個(gè)空格,不能使用制表符。推薦用Docker插件進(jìn)行格式化。

version: '3'
services:
  mysql: # 服務(wù)的名稱
    restart: always # 只要 docker 啟動(dòng),服務(wù)自動(dòng)啟動(dòng)
    image: daocloud.io/library/mysql:8.0.19 # 鏡像位置
    container_name: mysql # 容器的名稱,通過 docker ps 查看
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - 3306:3306 # 指定端口映射,可以指定多對(duì)映射
    environment:  # 設(shè)置環(huán)境變量
      MYSQL_ROOT_PASSWORD: screct # 指定 MYSQL root 用戶登錄密碼
      MYSQL_DATABASE: testdb # 初始化數(shù)據(jù)庫
      TZ: Asia/Shanghai # 指定時(shí)區(qū)

    volumes:
      - ./init:/docker-entrypoint-initdb.d # 初始化數(shù)據(jù),容器創(chuàng)建時(shí)自動(dòng)導(dǎo)入 MYSQL_DATABASE 指定數(shù)據(jù)庫,注意數(shù)據(jù)源必須在數(shù)據(jù)卷首次掛載前存在
      - /opt/docker_mysql/data:/var/lib/mysql # 映射數(shù)據(jù)卷
      - /opt/docker_mysql/config:/etc/mysql/conf.d' # mysql 配置文件目錄

  mongo:
    container_name: mongo
    image: mongo:latest
    restart: always
    ports:
      - '27017:27017'
    volumes:
      - /opt/docker_mongo/data/db:/data/db

  redis:
    container_name: redis
    image: redis:alpine
    restart: always
    volumes:
      - redis_data:/data

  express-mongo-demo:
    restart: always
    build: # 構(gòu)建自定義鏡像
      context: ./ # 指定 dockerfile 所在路徑,這里是當(dāng)前目錄
      dockerfile: Dockerfile # 指定 dockerfile 文件名
    image: express-mongo-demo:1.0.1 # 指定鏡像名字
    container_name: express-mongo-demo # 指定容器名字
    ports:
      - 8080:8080     
    depends_on: # 鏡像啟動(dòng)順序
      - redis
      - mongo
volumes: # docker create volume 創(chuàng)建的容器需要在這里聲明
    redis_data:
啟動(dòng)并運(yùn)行容器

運(yùn)行docker-compose命令后,默認(rèn)在當(dāng)前目錄下找docker-compose.yml文件

docker-compose up -d

如果mysql啟動(dòng)失敗,查看日志發(fā)現(xiàn)如下報(bào)錯(cuò)

mysqld: Can't create/write to file '/tmp/ibZhgm0t' (Errcode: 13 - Permission denied)

這是由于mysql沒有/tmp目錄寫入權(quán)限導(dǎo)致的,運(yùn)行sudo chmod 777 /tmp后重啟服務(wù)

關(guān)閉并刪除容器
docker-compose down
關(guān)閉容器同時(shí)刪除數(shù)據(jù)卷
docker-compose down --volumes
docker-compose down -v

只會(huì)刪除默認(rèn)容器

開啟|關(guān)閉|重啟已存在容器

該容器必須是由docker-compose所管理的

docker-compose start|stop|restart
查看容器
docker-compose ps
查看日志
docker-compose logs -f
docker-compose管理自定義鏡像
構(gòu)建自定義鏡像

Dockerfile

# 鏡像依賴的環(huán)境
FROM node:10

# 容器中的工作目錄
WORKDIR /usr/src/app

# 復(fù)制指令,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑。
COPY package*.json ./

# RUN 在 docker build 時(shí)運(yùn)行
RUN npm install

COPY . .

# 聲明端口,幫助鏡像使用者理解這個(gè)鏡像服務(wù)的守護(hù)端口,以方便配置映射。
EXPOSE 8080

# CMD 在 docker run 時(shí)運(yùn)行,多個(gè) CMD 僅最后一個(gè)有效。
CMD ["npm", "start"]

docker-compose.yml

version: '3'
services:
  mongo:
    container_name: mongo
    image: mongo:latest
    restart: always
    ports:
      - '27017:27017'
    volumes:
      - /opt/docker_mongo/data/db:/data/db

  redis:
    container_name: redis
    image: redis:alpine
    restart: always
    volumes:
      - /opt/docker_redis/data:/data

  express-mongo-demo:
    restart: always
    build: # 構(gòu)建自定義鏡像
      context: ./ # 指定 dockerfile 所在路徑,這里是當(dāng)前目錄
      dockerfile: Dockerfile # 指定 dockerfile 文件名
    image: express-mongo-demo:1.0.1 # 指定鏡像名字
    container_name: express-mongo-demo # 指定容器名字
    ports:
      - 8080:8080     
    depends_on:
      - redis
      - mongo
運(yùn)行自定義鏡像
docker-compose up -d

如果自定義鏡像不存在,會(huì)自動(dòng)構(gòu)建自定義鏡像,如果自定義鏡像已經(jīng)存在,會(huì)直接運(yùn)行這個(gè)鏡像

重新構(gòu)建自定義鏡像
docker-compose build
運(yùn)行前重新構(gòu)建鏡像
docker-compose up -d --build
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容