HackMD
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # [コンテナの歴史]Dockerができるまで 第三回 〜集合知を集めて歴史を知ろう〜 ## 目的(ゴール) - 時代や目的・背景を知って、コンテナについて理解を深める。 - どのような構成要素によってDockerが作られているかを知る。 ## 自己紹介 ### Sayaka - 名前:さやか - twitter:@flower_norn - 趣味: - 旅行 - 星空鑑賞、 - 自作PC(水冷)、 - カメラ ...etc - 職業: - ネットワークエンジニア上がりの広く薄くできる何でも屋さん。 - 最近はMS(Azure, AD, MBAM,SCCM..etc)がメイン。 ## 事前にお伝えしておくこと - Dockerの歴史は、コンピューターの歴史、仮想化の歴史とも言えます。 - 音声通話・チャットでの優しいまさかりを受け付けています。 - ※一緒に話に乗ってくれる方も募集しています。 ## 仮想化・コンテナ化の歴史における解決したい永遠のテーマ - 目的・背景 - 貴重なリソース(当時は高価だった)をいかに効率よく使用するか - セキュアな環境の確保 ## 前回の振り返り ### 1999 - Virtuozzo(OpenVZの前身)のファーストステップ ### 2000 - FreeBSD jail が FreeBSD 4.0 に導入 (Feature)x ### 2001 - Linux VServer - Mount namespaces ### 2003 - Google - The Borg System(Google) https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43438.pdf - Xen - The first stable Xen release https://sourceforge.net/p/xen/mailman/message/5533663/ ### 2004 - Solaris Containers(Zone) 登場 ### 2005 - OpenVZ プロジェクト発足 - UML - skas0 - separate kernel address space on stock hosts https://lwn.net/Articles/142494/ ## 必要基礎技術 ~~- リングプロテクション https://ja.wikipedia.org/wiki/リングプロテクション~~ - namespace - cgroup - netns - User Mode Linux https://ja.wikipedia.org/wiki/User_Mode_Linux - LXC https://ja.wikipedia.org/wiki/LXC - Linux VServer https://ja.wikipedia.org/wiki/Linux-VServer - Xen https://ja.wikipedia.org/wiki/Xen_(仮想化ソフトウェア) ```mermaid graph TD; TimeShareingSystem-->VM/370; VM/370-->LogicalPartition; LogicalPartition--> SolarisLocalDomain; LogicalPartition --> Xen; LogicalPartition --> VMware; LogicalPartition --> KVM; VM/370-->chroot; chroot-->Jail; Jail-->Virtuosso; Jail-->SolarisZone/Container; chroot--> LinuxVServer; Jail-->Lguest; LinuxVServer-->UserModeLinux; ``` ## 本編 ### 2002 - Mount Namespace 2002年8月3日 Linux 2.4.19 ### 2006 - Process (その後のcgroups) - 機能 - リソースの制限 - 優先順位付け - 費用請求のためにグループリソース使用量の測定 - プロセスグループの凍結 - 背景 - 限られた費用やリソース使うために生まれた。 - なおかつ、リソースは隔離して使うためでもある。 - 利用されているところ - systemd - CoreOS - Docker - LXC - Hadoop - Kubernetes - 備考 - Linux kernel 2.6.24 - 2006-11-29,Linux kernel 2.6.19により、UTS namespaces が実装 - 詳細 - 名前は、「UNIX Time-sharing System」から派生(←UTSの解説) - utsname構造体の名前空間化 - `uname` コマンドで取得できる情報 - システムコールによって返されるnodenameと domainnameの 2つのシステム識別子を分離 - 各コンテナは独自のホスト名とNISドメイン名を持つことができる - NIS:UNIXにおける各コンピュータのあれやこれやの情報を管理する仕組み=WindowsのActive Directory - NISドメイン名;NISで使われる個々の名前 - 背景 - 利用されているところ - コンテナを起動すると普通は使う - 2006-11-29,Linux kernel 2.6.19により、IPC namespaces が実装 - 詳細 - 特定のプロセス間通信(IPC)リソース、つまりSystem V IPCオブジェクトと(Linux 2.6.30以降の)POSIXメッセージキューを分離 - IPCオブジェクトがファイルシステムのパス名以外のメカニズムによって識別されること - 独自のSystem V IPC識別子セットと独自のPOSIXメッセージキューファイルシステムがある。 - http://linuxjm.osdn.jp/html/LDP_man-pages/man7/svipc.7.html - 背景 - 利用されているところ ### 2007 - Solaris LDoms - Local Domain Logical Domains (LDoms or LDOM) is the server virtualization and partitioning technology for SPARC V9 processors. It was first released by Sun Microsystems in April 2007 - Notes from a container [LWN.net] (October 29, 2007) https://lwn.net/Articles/256389/ ### 2008 - LXC (LinuX Containers) - 機能 - cgroupsとLinuxネームスペースを使って実装 - プレーンなLinuxカーネルが利用可能 - 個別のプロセスとネットワークスペースを作り出す仮想環境 - コンテナ用のOSテンプレートやツールセットが利用可能 - 背景 - Linux kernel に実装が進むコンテナ関連機能を開発者が試せるように実装が始まった - 2008-01-24,Linux kernel 2.6.24 Linux_2_6_24 - Linux Kernel Newbies https://kernelnewbies.org/Linux_2_6_24#PID_and_network_namespaces - PID namespaces が実装 - 詳細 - プロセスID番号空間を分離 - 異なるPID名前空間のプロセスは、同じPIDを持つことができる - コンテナー内のプロセスに同じプロセスIDを保持しながら、コンテナーをホスト間でマイグレーションできる - 各コンテナが独自のinit(PID 1)を持つことを可能 する。 - 背景 - 利用されているところ - cpu cgroup(相対配分機能) - 詳細 - CPU の割当を他cgroupとの相対比率で指定できる - cpuacct cgroup - 詳細 - cgroup内のプロセスがどれだけCPUを使ったかをカウントできる - cpuset cgroup - 詳細 - cgroup内のプロセスがどのCPU、CPUコア、NUMA(メモリ)ノードを使えるか指定できる - 元々cgroupの機能としては開発されていなかった - 2008-07-13,Linux kernel 2.6.26 - device cgroup - 詳細 - cgroup内のプロセスのデバイスへのアクセス許可を指定できる - 2008-12-25,Linux kernel 2.6.28 - freezer cgroup - 詳細 - cgroup内のプロセスを一斉に停止させたり再開させたりできる ### 2009 - 2009/02, AUFS v1が正式リース - 2009-03-24,Linux kernel 2.6.29 - Network namespaces が実装 - 2.6.24で実装され、2.6.29で完成(その後も機能追加はされているけど…) - 詳細 - ネットワークに関連するシステムリソースの分離 - 独自のネットワークデバイス、IPアドレス、IPルーティングテーブル、/ proc / netディレクトリ、ポート番号を持つことができる。 - 固有の(仮想)ネットワークデバイスと、名前空間ごとのポート番号空間にバインドする独自のアプリケーションを持つことができる。 - ホストシステムの適切なルーティングルールは、ネットワークパケットを特定のコンテナに関連付けられたネットワークデバイスに送ることができる - 同じホストシステム上に複数のコンテナ化されたWebサーバーを配置し、各サーバーを(コンテナ単位の)ネットワーク名前空間のポート80にバインドすることができる。 - 背景 - 利用されているところ - memory cgroup - 詳細 - cgroup内のプロセスのメモリ使用量を制限できる - net_cls cgroup - 詳細 - tcコマンドから使えるようにパケットにマーキングできる(cgroup内のプロセスのネットワーク帯域制御ができる) ### 2010 - 2010-02-24,Linux kernel 2.6.33によりblkio cgroupが実装 - 機能 - blockデバイスのI/Oの優先度をcgroup間の相対配分で指定できる - memory cgroupとの連携がないのでbuffered I/O(通常のディスクIOですな)をちゃんと制限できない(Direct I/Oのみ) - buffered I/Oの制限はcgroup v2で実現 ### 2011 - Warden (CloudFoundry) - 機能 - デーモンとして動作し、コンテナ管理のためのAPIを提供する、あらゆるオペレーティングシステム上の環境を隔離することができる。 - 複数のホスト間でコンテナのコレクションを管理するためのクライアント/サーバーモデルがある。 - cgroup、namespace、およびプロセスのライフサイクルを管理するサービスが含まれている。 - 詳細なアーキテクチャは [https://www.slideshare.net/i_yudai/warden](https://www.slideshare.net/i_yudai/warden) を参照 - 2011-01-04,Linux kernel 2.6.37 - blkio cgroupに帯域制御機能が追加 - 機能 - I/Oの帯域制御ができる(IOPSや流量制限) - Direct I/Oのみの制限なのは同じ - cgroupに clone_children 機能実装 - 機能 - cpusetで親cgroupの設定を子が引き継げる - これにより2.6.33で実装されていた問題がある機能であるとされた ns cgroup が削除できる準備が整う(ns cgroupは3.0で削除) ### 2012 - 2012-01-04,Linux kernel 3.2でcpu cgroupに帯域制御機能が追加 - 機能 - cgroup内のプロセスが使うCPUの処理時間を制限できるようになった - 2012-03-18,Linux kernel 3.3でperf_event cgroupがマージ - 2012-09-30,Linux kernel 3.6でhugetlb cgroupがマージ ### 2013 - Omega (google) - Omega: flexible, scalable schedulers for large compute clusters – Google AI https://ai.google/research/pubs/pub41684 - 2013年2月18日,カーネルメモリコントロールグループ(kmemcg)がLinux Kernel 3.8にマージ - 機能 - カーネルが独自の内部プロセスを管理するために利用できるメモリ量を制限する(実装途中 - 2013-02-28,Linux kernel 3.8 - User namespaces が実装 - 詳細 - ユーザーIDとグループID番号のスペースを分離 - プロセスのユーザーIDとグループIDは、ユーザー名前空間の内部と外部で異なる物を持つことができる。 - プロセスが、名前空間内に通常の特権のないユーザーIDを持つことができ、同時に名前空間内にユーザーIDが0である - 特権を持たないプロセスがユーザーネームスペースを作成することができる(他のnamespaceは特権が必要) - 3.9でXFS以外のファイルシステムで、3.12でXFSで使えるようになる(実質使えるようになったのが3.12) - 背景 - 特権を持たないプロセスに限定的ではあるが特権を渡すことでセキュアにコンテナを起動する - 利用されているところ - LXDが起動するコンテナは非特権コンテナなのでこの機能を使う - setns が全namespaceで使えるようになった - ホスト環境からコンテナ(名前空間)内でプロセスを実行できる(コンテナ内に入れる) - Let Me Contain That For You(LMCTFY)がグーグルにより公開 - 詳細 - Google's container stackのopen-source版である。 - アプリケーションコンテナで使うことを想定して作られた - ユーザが cgroupfs の細かい点を理解していなくても,やりたいことが実現できるようなインターフェースを持つ - 2013年3月26日、Docker がオープンソースのソフトウェアとして公開 - 詳細 - dotcloudがSaaSのために作ったアプリケーションコンテナ - 2013-09-02, Linux kernel 3.11でCheckpoint/Restart関連機能の実装が揃う - 機能 - ある時点のプロセスの状態を保存し、展開し、プロセスを再開できる - コンテナのチェックポイント・リスタート(ライブマイグレーション)が可能に - この機能を実装したユーザランドのプログラムが [CRIU](https://criu.org/) (OpenVZプロジェクトの成果) - 背景 - コンテナのライブマイグレーションを実現したい - 利用されているところ - LXC/LXD ### 2014 - 2014-02-20 LXC 1.0.0 リリース - https://linuxcontainers.org/ja/lxc/news/#lxc-100-2014-2-20 - Kernfs、2014年3月にLinux Kernel 3.14のLinuxカーネルに導入 - 機能 - cgroupを利用したファイルシステム - sysfsロジックのいくつかを独立したエンティティに分割 - 他のカーネルサブシステムが、デバイスの接続と切断 - 必要に応じての動的な作成と削除 - その他の属性を扱う独自の仮想ファイルシステムをより簡単に実装 - 2014年6月10日,Docker 1.0リリース - 詳細 - コンテナのイメージを置く場所であるDocker Hub発表 - 2014年6月10日,Kubernetes の公開 (google) - Google Cloud Platform Blog: An update on container support on Google Cloud Platform https://cloudplatform.googleblog.com/2014/06/an-update-on-container-support-on-google-cloud-platform.html - 2014年12月, ? - 2014-12-07, Linux kernel 3.18でoverlayfsがマージ - 機能 - aufsのような重ね合わせファイルシステム - Ubuntu/SuSEはマージ以前からカーネルにパッチがあたっていた ### 2015 - 2015年4月9日、 AWS EC2 Container Service(ECS)を発表し、Dockerをサポート。 - 2015年5月4日, 「Windows Server 2016 Technical Preview 2」において、Nano Serverがサポート - 詳細 - Windowsカーネルとネットワークなど最低限の機能を実装 - GUIはない - Windows Serverより93%低いVHDサイズ、92%の重要なセキュリティ勧告、および80%少ない再起動を備えている。 - 背景 - 従来のWindows Serverではリソースを使いすぎることでサーバーに乗せずらい、利用が難しい。 - [Nano Server投入に見るMSの思惑](https://wp.techtarget.itmedia.co.jp/contents/16712) - 2015年6月22日, Linux Foundationがコンテナ技術の標準化を目指す「Open Container Project」を立ち上げ - 参加企業 - Dockerのほか、Apcera、Amazon Web Services(AWS)、Cisco Systems、CoreOS、EMC、富士通、Google、Goldman Sachs、Hewlett-Packard(HP)、Huawei Tehcnologies、IBM、Intel、Joyent、Pivotal、Mesosphere、Microsoft、Rancher、Red Hat、VMWareが参加 - 2015年7月21日, Kubernetes v1.0のリリース - Kubernetesがv.1.0に到達、Googleは新組織Cloud Native Computing Foundationを立ち上げ、技術を寄贈 | TechCrunch Japan https://jp.techcrunch.com/2015/07/22/20150721as-kubernetes-hits-1-0-google-donates-technology-to-newly-formed-cloud-native-computing-foundation-with-ibm-intel-twitter-and-others/ - 2015年8月19日, 「Windows Server 2016 Technical Preview 4」において, Server Containersを実装 - 詳細 - Windowsで初のDokcerを採用し、Windowsコンテナを作成できる基盤が完成 - 同じOSカーネルを共有する。 - 仮想化を導入する必要はない。 - 背景 - ちなみに Virtuozzo(OpenVZの商用版)にもWindows版がありました。MSの協力なしには開発できないと思われるので元々ベースとなる技術はMSにあったのかもしれません(想像です) - 2015-11-01, Linux kernel 4.3にpids cgroupがマージ - 機能 - cgroup内のプロセスがforkできるプロセス数を制限できる - 勉強会中に言った fork bomb 対策 - 2015年11月19日, 「Windows Server 2016 Technical Preview 4」において, Hyper-V Containersを実装 - 詳細 - Windowsコンテナを作成できる基盤が完成。 - hyper-v上にコンテナ専用のOSが起動する - ホストOSから各コンテナを分離できる。 - 専用のWindowsカーネルが利用可能。 - 2015年12月、Dockerが独自のコンテナオーケストレーションツールのDocker Swarmを発表 - 機能 - コンテナのクラスタ化 - 管理コンソールが付随 ### 2016 - 2016-03-13, Linux kernel 4.5でcgroup v2がstableに(最初に入ったのは開発版扱いで3.16 / 2014-08-03) - cgroup v2のいきさつは http://gihyo.jp/admin/serial/01/linux_containers/0037 でもご覧ください(宣伝w) - 2016年4月19日, Microsoft AzureがAzure Container Service(ACS)を発表、Dockerをサポート。 - 2016-05-15, Linux kernel 4.6にcgroup namespaceがマージ - コンテナごとの独立したcgroupツリーを見せることができるようになった - 2016年6月、DockerにSwarmバンドルを発表 - 2016年12月、Dockerからcontainerdが分離 ### 2017 - 2017年2月7日,「Kubernetesはオープンソースのコンテナオーケストレーションのデファクトになった」と、CoreOSがfleetの開発を終了、代わりにKubernetes採用を発表 - 2017年4月,Moby Project発表 - 2017-04-30, Linux kernel の rdma cgroup がマージ - 2017年7月,Open Container Initiative、コンテナ関連の標準仕様v1.0を発表 - 2017年10月, DockerがKubernetesをサポート - 2017年10月17日,Windows Subsystem for Linuxが正式リース - 個人的な背景考察 - コンテナを使うためにLinuxカーネルが必要であり、Microsoftもその盛り上がりにWindowsにLinuxを実装せざるえなかったとおもう。そうしなければ、コンテナの開発がしずらい状況になるのは明白であり、Windowsユーザーが離れていくことを懸念していたのではないかと考察する。=MSの焦り ### 2018 - 2018年4月, Docker発展の貢献者、Docker社創業者兼CTOのSolomon Hykes氏がDockerを去ると発表 ### これから~そして未来 - 調べる時間が足りず考察をすることができませんでした。申し訳ないです。 - ただ思うことは、より便利により効率よく管理できサービスを提供時代が来るのでしょう。障害があっても自動で復旧してくれるようなマイクロサービスを実現してくれる基盤がコンテナだと思っています。 ## special thanks - @ten_forward さん (情報提供および加筆修正) - @kazutomi‗m (一緒に進行役) - リスナーの皆様 ## referenced of Links the historical - [Container_histroy.md by tenforward](https://gist.github.com/tenforward/62261970762dd5ea0b6eedeee11e5531) - [Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料](https://www.slideshare.net/KamezawaHiroyuki/cgroup-38793119) - [Namespace](https://lwn.net/Articles/531114/) - [上記の日本語訳](https://github.com/lxc-jp/Namespace-in-Operation-ja) (誤訳とかあったら指摘よろしく) - [AUFS](http://aufs.sourceforge.net/History) - [A Brief History of Containers: From the 1970s to 2017](https://blog.aquasec.com/a-brief-history-of-containers-from-1970s-chroot-to-docker-2016) - [Linux namespaces](https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Linux_namespaces.html) - [Plan 9 from Bell Labs](https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Plan_9_from_Bell_Labs.html) - [The History of Container - Redhat Blog]: https://rhelblog.redhat.com/2015/08/28/the-history-of-containers/ https://www.kishiro.com/FreeBSD/jail.html - [OpenVZ]: https://wiki.openvz.org/History - [Parallels: : SWsoft Releases Virtuozzo 2.0, Bringing Mainframe-Inspired Functionality to Intel-Based Servers]: http://www.odin.com/news/id,6987 - [Announce: many virtual servers on a single box]: http://lkml.iu.edu/hypermail//linux/kernel/0110.1/0909.html - [The first stable Xen release]: https://lwn.net/Articles/52033/ - [FreeBSD jail]: http://phk.freebsd.dk/pubs/sane2000-jail.pdf ---- ### memo - vertualizationの登場 - chrootの登場 - namespaceの登場 - jailの登場

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully